2012-03-05 11 views
0

私はいくつかのSpring Beanを共有ライブラリジャーに入れています。私は@Qualifierを働かせるように見えない。Beanが別のjarファイルにあるときにSpring @Qualifierが動作しない

"byType"に設定されています。これはSpring 3.1.0.M2を使用しており、スタンドアロンの実行可能ファイルとして実行しています。共有ライブラリから "TestTwoBean"を削除すると、プロジェクトは期待通りに実行されます。

にmyproj-共有lib.jar:

@Service 
public class TestOneBean implements ITestBean { 
} 

@Service 
public class TestTwoBean implements ITestBean { 
} 

がmyproj.jar:

@Service 
public class TestConsumerBean { 

    @Autowired @Qualifier("testOneBean") 
    private ITestBean bean; 

} 

私は、実行時に例外"名前を持つユニークな豆" を取得しません:

org.springframework.beans.factory.UnsatisfiedDependencyException: ファイル ' - 'に 'testConsumerBean'という名前のBeanを作成する際にエラーが発生しました。 Beanプロパティ 'bean'によって満たされていない依存関係が表示されました:: No [com.myco。 ITestBean]が定義されています:予期される単一の が一致するBeanですが、見つかった2:[testOneBean、testTwoBean];ネスト 例外org.springframework.beans.factory.NoSuchBeanDefinitionExceptionある:[com.myco.TestBean]が定義されているタイプの無 ユニークビーン:期待単一 マッチングビーンなく2が見つかりました:[testOneBean、testTwoBean] org.springframeworkで.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1167) ...

@Qualifierは、このような状況では動作しませんか?既知の回避策はありますか?

答えて

2

autowireをタイプAND注釈注入で使用してもよろしいですか?型を使ってAutowireを実行すると、Springは検出されたセッターとコンストラクターパラメーターを注釈付きでない場合でも型ルックアップを使用して注入しようとします。

同時に、名前でフィールドを挿入しようとしています。 @Service注釈付きクラスでは、名前がデフォルトでクラス名 "testOneBean"と "testTwoBean"のBeanを生成します。 @Qualifierは、正確な一致としてBean名を使用します。しかし、 "名前で"インジェクションを行う推奨方法は@Resource(name="testOneBean")です。私はあなたが本当に必要と疑うタイプによって設定されたautowireモードのために、タイプによって春の試し注入を推測することができます。

デフォルトのオートワイヤーモードに戻し、@Resourceを名前で配線することをお勧めします。

+0

いくつか良い点があります。このアプリケーションの残りの部分はもともとゼロ設定アプローチ(型オートワイヤリング、注釈なし)を使用して作業しましたが、この新しい重複したBeanの問題は規約を破っていました。 2つのメソッドを混在させる簡単な方法はないように見えるので、厳密な配線(default-autowire = "no")を使用し、すべてのBeanに注釈を付けるようにコードベース全体をリファクタリングしました。これは例外を修正し、この種の将来の回帰を避けるべきです。ありがとう! – seanhodges

関連する問題