58

春にマップを次のように定義しました。

<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: Could not autowire field: private java.util.Map DutyCreator.additionalParams; です。ネストされた例外は org.springframework.beans.factory.NoSuchBeanDefinitionException: 依存関係に一致するタイプ [java.lang.String] の Bean が見つかりません [値タイプ java.lang.String のマップ]: オートワイヤー候補として適格な少なくとも 1 つの Bean が必要ですこの依存関係のために。依存関係アノテーション: {@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 のマップ]: autowire 候補として適格な少なくとも 1 つの Bean が必要ですこの依存関係のために。依存関係アノテーション: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=AdditionalParams)}

何か案は?

乾杯。

4

3 に答える 3

119

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 を使用します

于 2012-12-17T12:19:35.463 に答える
3

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

次の注釈を使用してマップを使用してみてください:

@Resource
private Properties AdditionalParams;

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

于 2012-12-17T12:21:29.117 に答える
2
@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);
 }

このソリューションは私にとってうまくいきます

于 2014-10-10T01:22:57.820 に答える