web-dev-qa-db-ja.com

SpringはMap Beanを自動配線できません

私は春の地図を次のように定義しました:

<util:map id="AdditionalParams" scope="prototype" map-class="Java.util.HashMap" 
          key-type="Java.lang.String" value-type="Java.lang.String">

    <entry key="Start" value="12345" />
    <entry key="Finish" value="12365" />
</util:map>

そして、このBeanを次のように定義されたプロパティに自動配線しています。

private @Autowired @Qualifier(value = "AdditionalParams") Map<String, String> additionalParams;

これを行うと、例外がスローされます:

原因:org.springframework.beans.factory.BeanCreationException:「DutyCreator」という名前のBeanの作成エラー:自動配線された依存関係の挿入に失敗しました。ネストされた例外はorg.springframework.beans.factory.BeanCreationException:フィールドを自動配線できませんでした:private Java.util.Map DutyCreator.additionalParams;ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:依存関係[値型Java.lang.Stringのマップ]に一致するタイプ[Java.lang.String]の一致するBeanが見つかりません:自動配線候補として適格なBeanが少なくとも1つ必要ですこの依存関係。依存性アノテーション:{@ org.springframework.beans.factory.annotation.Autowired(required = true)、@ org.springframework.beans.factory.annotation.Qualifier(value = AdditionalParams)}

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

何か案は?

乾杯。

57
Nick

Spring 4.3以降では、@Autowiredリストとマップを挿入できます で、質問内の指定されたコードは機能します。

ただし、4.3の時点で、要素タイプ情報が@Autowired戻り値の型の署名またはコレクションの継承に保存されている限り、Springの@Beanタイプマッチングアルゴリズムでもコレクション/マップおよび配列タイプをマッチングできます。階層。

しかし、Springの下位バージョンでは、そのようなコレクションを自動配線することはできません。ただし、次のことができます。

@Resource(name="AdditionalParams")
private Map<String, String> additionalParams;

あるいは:

@Value("#{AdditionalParams}")
private Map<String, String> additionalParams;

spring docs 、ヒントセクションを確認してください:

それ自体がコレクションまたはマップタイプとして定義されているBeanは、タイプマッチングが適切に適用されないため、@ Autowiredを介して注入できません。このようなBeanには@Resourceを使用します

117
garst

@ Qualifier(value = "AdditionalParams")が機能していないようです。

注釈に従ってマップを使用してみてください。

@Resource
private Properties AdditionalParams;

applicationContext.xmlファイルをそのまま保持します。

3
Amber
@Autowired ApplicationContext ctx;
private  <T> T getBean(String qualifier, Class<T> returnType){
    //use this for loop to print all bean from ctx. so you wont miss the typo.
    /*for(String s:ctx.getBeanDefinitionNames())
        log.info(s);*/
    return ctx.getBean(qualifier, returnType);
}

//通話中

 if(providerList == null){
       providerList = ctx.getBean("providerList", Map.class);
 }

このソリューションは私にぴったりです

2
Ramkumar Pillai