복붙노트

[SPRING] Spring은 Map bean을 autowire 할 수 없다.

SPRING

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>

그리고 나서 다음과 같이 정의 된 속성에이 bean을 autowiring합니다.

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

이 작업을 수행 할 때 예외가 throw됩니다.

어떤 아이디어?

건배.

해결법

  1. ==============================

    1.Spring 4.3부터 @Autowired는 목록과 맵을 삽입 할 수 있으며 질문에 주어진 코드가 작동합니다.

    Spring 4.3부터 @Autowired는 목록과 맵을 삽입 할 수 있으며 질문에 주어진 코드가 작동합니다.

    그러나 더 낮은 버전의 Spring에서는 이와 같은 콜렉션을 autowire 할 수 없습니다. 그러나 다음을 수행 할 수 있습니다.

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

    또는:

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

    스프링 문서, 팁 섹션을 확인하십시오.

  2. ==============================

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

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

    주석을 달아지도를 사용해보십시오.

    @Resource
    private Properties AdditionalParams;
    

    applicationContext.xml 파일을 손상시키지 않고 유지해야합니다.

  3. ==============================

    3.

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

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

  4. from https://stackoverflow.com/questions/13913752/spring-cant-autowire-map-bean by cc-by-sa and MIT license