2012-04-02 4 views
0

指定されたリソースリゾルバを使用するためにSpringアプリケーションコンテキストを操作する方法を知っている人はいませんか。私はam3 s3のセキュリティコンテキストからコンテンツを取得するためにs3リソースを作成し、リソースリゾルバはs3:// ... type URLからこれらの "リソース"を作成し、ローカルアプリケーションコンテキストはロード時に正しいセキュリティ資格情報を使用します設定されたamazons3clientから取得します。新しく構築されたs3リソース用にAmazonS3クライアントを事前設定するs3 ResourceLoaderを作成しました。Springframeworkアプリケーションコンテキストリソースリゾルバ

これらのリソースをコンテキスト設定で「s3:// ...」と指定すると、このリソースリゾルバを使用して適切なリソースタイプを作成することができますが、ここではこれをオーバーライドする必要があります。 SpringのApplicationContextのgetResourceメソッドは、独自のresourceResolver実装を使用するためにDefaultResourceLoaderから継承されています。

「s3:// ...」スキームと一致するリソースの変数リゾルバを設定して、そのリソースリゾルバでリソースタイプを解決することも、もう一つの課題です。

私はS3セキュリティのニーズを非常に扱いやすくするために、Springアプリケーションのコンテキスト(ClasspathXMLAC for argument)のインフラストラクチャを操作するためのより良い方法を知っていることを望んでいます。

その他の提案は大歓迎です。

答えて

1

#setResourceLoaderメソッドを提供するSpringのGenericApplicationContextの実装を使用します。

あなたは、GenericApplicationContextではないClassPathXmlApplicationContextについて言及しました。これは、醜いオーバーライドルートを強制されることを意味します。

一般的に、GenericXmlApplicationContextはCPXACの代替として推奨されています。名前が示唆するように、GenericApplicationContextです。

ですから、次の操作を行うことができる必要があります:

明らか
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); 
ctx.setResourceLoader(new S3ResourceLoader()); 
ctx.load("s3:///some.bucket.name/path/to/my/spring.xml"); 
ctx.refresh(); 
... 

、S3ResourceLoaderはS3ResourceLoaderは、おそらくすべて拾うためにDefaultResourceLoaderを拡張する必要があることに注意してくださいなどのキーとパラメータ化する必要があります利用可能な他の機能、例えば"classpath:"とその他のリソース接頭辞を処理します。

上記の例での呼び出しの順序は、明白な理由から#loadがs3:resource接頭辞で呼び出される前に提供される必要があります。

+0

私はこの機能がコンテキストの中でBeanのために選択されることを望んでいました。私が現在取り組んでいるのは、AmazonS3Client Beanを設定してから、DefaultResourceLoaderを継承したDependent ApplicationContextAware S3Loader Beanを設定し、setApplicationContextを実行することです。「GenericApplicationコンテキストのアプリケーションインスタンスなら、s3LoaderにresourceLoaderを設定します。リソースローダーはs3とMongoDBs GridFSをサポートする必要があるので、新しい名前が必要です:P。 – gbegley

+0

N ResourceLoaderインスタンスにデリゲートするCompositeResourceLoaderを作成することを検討してください。すべてを単一のCompositeResourceLoaderの下に置いて、それをGenericApplicationContext#setResourceLoaderメソッドに渡します。 –