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
'developer tip' 카테고리의 다른 글
IE8 CSS @ font-face 글꼴은 콘텐츠가 끝나기 전, 가끔 새로 고침 / 하드 새로 고침시에만 작동합니다. (0) | 2020.12.15 |
---|---|
자바 스크립트 연관 배열의 길이 (0) | 2020.12.15 |
서브 플롯의 파이썬 xticks (0) | 2020.12.15 |
SQL Server 2008 Express 데이터베이스에 모든 쿼리를 기록 하시겠습니까? (0) | 2020.12.15 |
매개 변수가있는 메소드 이름에서 선택기 작성 (0) | 2020.12.15 |