7

私はSpringアプリケーションを持っています(WebアプリケーションではなくSpringBatch)。テストクラスでは、特定のタイプのすべてのBeanへのアクセスを取得したいと思います。

春には、通常IOCを使用して、コンテナーにBeanを注入させる必要があることを理解しています。ただし、この場合、特定のクラス(org.springframework.batch.item.database.JdbcCursorItemReader)を拡張する可変数のBeanをループして、何かを実行します(接続するだけのユニット/統合テストにします)。これをデータベースに送信して1行を読み取るため、テスト時に、システム内のすべてのJdbcCursorItemReaderに有効なSQLおよび行マッパーがあることを確認できます。

問題1)一度に1つしか豆を入手できません。クラスにBeanFactoryAwareを実装させて、自分のBeanfactoryへの参照を取得することができます。次に、beanFactory.getBean( "name");を実行できます。単一のBeanにアクセスします。代わりにすべてのBeanを取得するにはどうすればよいですか?ループして、必要なクラスではないものを削除することはできますが、どういうわけか、Beanfactoryが知っているすべてのBeanのリストなどが必要です。

問題2)Beanfactoryから返されるBeanはプロキシです。Beanをキャストして使用しようとすると、 java.lang.ClassCastExceptionのようなものが表示されます。$Proxy0をorg.springframework.batch.item.database.JdbcCursorItemReaderにキャストできません。

4

1 に答える 1

12

ApplicationContextAwareの代わりにを使用すると、最初の問題を回避できますBeanFactoryAware。これにより、が渡されますApplicationContext。これにgetBeansOfType()は、特定のタイプのすべてのBeanを取得できるメソッドがあります。

JdbcCursorItemReader2番目の問題は、 Beanの周囲にAOPプロキシが作成されていることが原因である可能性があります。これらの生成されたプロキシは、デフォルトで、JdbcCursorItemReader(具体的には、ItemReaderおよびItemStream)と同じインターフェイスを実装します。コードはクラスタイプ()にキャストしようとするのではJdbcCursorItemReaderなく、代わりにそれらのインターフェイスタイプの1つにキャストする必要があります。通常、プロキシにプロキシされたクラスを直接拡張させることは可能ですが、セットアップについて何も知らなければ、私はそれを支援することはできません。

于 2010-10-09T17:02:28.057 に答える