developer tip

Spring은 Map Bean을 autowire 할 수 없습니다.

copycodes 2020. 12. 15. 19:27
반응형

Spring은 Map Bean을 autowire 할 수 없습니다.


봄에지도를 다음과 같이 정의했습니다.

<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>

그런 다음이 빈을 다음과 같이 정의 된 속성에 자동 연결합니다.

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

이렇게하면 다음과 같은 예외가 발생합니다.

원인 : org.springframework.beans.factory.BeanCreationException : 이름이 'DutyCreator'인 빈 생성 오류 : 자동 연결 종속성 주입에 실패했습니다. 중첩 된 예외는 org.springframework.beans.factory.BeanCreationException입니다. 필드를 자동 연결하지 못했습니다. private java.util.Map DutyCreator.additionalParams; 중첩 된 예외는 org.springframework.beans.factory.NoSuchBeanDefinitionException입니다. 종속성에 대해 일치하는 [java.lang.String] 유형의 Bean이 없습니다. [값 유형이 java.lang.String] 인 맵핑 : autowire 후보로 자격이있는 하나 이상의 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 후보로 자격이있는 하나 이상의 Bean이 필요합니다. 이 종속성. 종속성 주석 : {@ org.springframework.beans.factory.annotation.Autowired (required = true), @ org.springframework.beans.factory.annotation.Qualifier (value = AdditionalParams)}

어떤 아이디어?

건배.


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;

봄 문서 , 팁 섹션을 확인하십시오 .

자체적으로 컬렉션 또는 맵 유형으로 정의 된 Bean은 유형 일치가 제대로 적용되지 않기 때문에 @Autowired를 통해 삽입 할 수 없습니다. 그런 빈에 @Resource 사용


@Qualifier (value = "AdditionalParams") 가 작동하지 않는 것 같습니다 .

다음 주석으로지도를 사용해보십시오.

@Resource
private Properties AdditionalParams;

applicationContext.xml 파일을 그대로 유지하십시오.


@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);
 }

이 솔루션은 나에게 잘 작동합니다.

참조 URL : https://stackoverflow.com/questions/13913752/spring-cant-autowire-map-bean

반응형