2011-02-09 4 views
8

私はSpring 3.0.4を使用しています。私はマップ上で@Autowired注釈を使用するいくつかの豆を持っています。これらのマップはapplication-context.xmlファイル内で定義されます(これらのマップはいくつかのファクトリメソッドを使用して構築されるため)。Autowiring Mapが期待通りに動作しない

デバッガを使用すると、適切に(予想される)Bean IDを使用してマップが構築されることがわかります。しかし、autowiringプロセスが開始されると、作成されたばかりのidを持つBeanは見つからないと主張します。コードの

ワンピース:コンテキストXMLの

@Autowired 
@Qualifier("dienstverbandMap") 
private Map<String, String> dienstverbandMap; 

ワンピース:私は私のクラスとコンテキストXMLその両方にjava.lang.Objectのに種類を変更

<bean class="java.util.HashMap" id="dienstverbandMap" factory-bean="someFactoryMethod" factory-method="getMappedMap"/> 

重要なディテール、 は有線になります実際には、私は自分のコードでHashMapにキャストし、すべてを動作させることができます。しかし、それは私が明らかにしたいことではありません。

誰かが私が間違っていることを説明しましたか?

答えて

4

これはdienstverbandMapの型パラメータと関係があると思います。 Beanインスタンス(HashMap)が実際にHashMap<String, String>としてインスタンス化されたことをSpringが認識できる場合にのみ、注入は安全に実行できます。 Beanの宣言された型が生の型であるため、Springは型パラメータを失う可能性があります。

ファクトリメソッドの結果シグネチャが間違っている可能性があります。例えばHashMapの代わりにMap、またはHashMap<String, String>ではなく生のHashMapを使用します。

は(あなたが私たちにファクトリメソッドの宣言を示した場合は、これらの理論のいくつかは、反証することができます。)ところで


、春豆2.0 DTDと3.0 XSDのコメントによると、 factory-bean属性を指定すると、class属性は使用されません。あなたは完全にそれを残してみましたか?

+1

あなたはそうです。私のファクトリメソッドのシグネチャはMap <>を返し、それをHashMapに変更するとすべてが機能し始めました。ありがとう!! :) –

+0

私は、工場は戻り値の型をMap(またはより具体的)にするInterfaceを実装していると考えました。しかし、それでもそれはうまくいかなかった。私はこれを動作させるためにインタフェースを変更しなければならなかった。 Yuk :) –

0

は、私はあなたのファクトリメソッドがjava.util.Map、ないjava.util.HashMapを返しますかなり確信しているので、私はあなたがおそらくこれを行うことができると思います:

<bean class="java.util.Map" id="dienstverbandMap" 
     factory-bean="someFactoryMethod" factory-method="getMappedMap"/> 

免責事項:春は、あなたがそのMapようにやらせます場合、私はわからないんだけどインターフェイスですが、試してみる価値があります。

+0

私は、Beanの型をjava.util.Mapに設定しようとしました。しかし、役に立たない。あなたの提案をありがとう。 –

5

3.11.3. Fine-tuning annotation-based autowiring with qualifiers:

引用: 名前で、アノテーション駆動型の注入を表現する場合は、主に@Autowiredを使用していない - @Qualifier値を通じてBean名を参照するのは技術的に可能であったとしても。その代わりに、JSR-250 @Resourceアノテーションは、特定のターゲットコンポーネントを一意の名前で識別するために意味的に定義されていますが、宣言されたタイプはマッチングプロセスとは無関係です。

この意味の違いの具体的な結果として、コレクションまたはマップタイプとして定義されたBeanは、@Autowiredを介して注入できません。タイプマッチングが適切に適用されないためです。特定のコレクション/マップBeanを一意の名前で参照して、そのようなBeanに@Resourceを使用します。

+0

@Resource注釈に関してさらにお勧めの文書はありますか? –

+1

ちょっとメモしておきますが、リソースアノテーションを試したところ、Tomcatではうまくいきましたが、JBossではうまくいきませんでした。 @Resource注釈ハンドラはプラットフォームに依存しているようです。 – BillMan

0

マップのBean定義にタイプパラメータが含まれていないため、自動配線で正しいタイプであることを確認できません。

<util:map>を使用する場合は、型パラメータを指定できますが、独自のファクトリメソッドを使用することはできません。唯一の他の解決策は、あなたのbeanをraw Map(悪い)にするか、またはbean定義の中のマップを明示的に配線する(より良い)ことです。

関連する問題