25

Spring (3.0.5) を使用して applicationContext でこれを行うことができます。

<bean id="map" class="java.util.HashMap" scope="prototype" >
    <constructor-arg>
        <map key-type="java.lang.String" value-type="java.lang.String">
            <entry key="Key 1" value="1" />
            <entry key="Key 2" value="2" />
        </map>
    </constructor-arg>
</bean>

私のコントローラーでは、次のようにマップを自動配線できます。

@Autowired
@Qualifier("map")
private HashMap<String, String> map;

うまくいきますが、これを行うと:

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

私はそれを得る:

原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 依存関係に一致するタイプ [java.lang.String] の Bean が見つかりません [値タイプ java.lang.String のマップ]: autowire 候補として適格な少なくとも 1 つの Bean が必要ですこの依存関係のために。依存関係アノテーション: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=map)}

私の質問は次のとおりです。実装ではできるのに、インターフェイスでマップを自動配線できないのはなぜですか?

ありがとう。

4

2 に答える 2

36

コレクション型の Bean を宣言している間、@Autowired を介して注入することはできません。以下の Spring のドキュメントを参照してください。

4.11.3 修飾子を使用したアノテーションベースのオートワイヤーの微調整

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

したがって、代わりに@Autowired、次を使用します@Resource

@Resource
@Qualifier("map")
private Map<String, String> map;
于 2012-12-19T09:26:08.587 に答える
11

@Resource代わりに使用してみてください@Autowired

@Resource(name="map") 
private HashMap<String, String> map;

Spring のドキュメントの3.9.3 修飾子を使用した注釈ベースの自動配線の微調整のヒントを確認してください。

于 2012-12-19T09:21:46.660 に答える