2011-02-09 2 views
8

Spring 3.0.4를 사용하고 있습니다. 지도에서 @Autowired 주석을 사용하는 콩이 있습니다. 이 맵은 application-context.xml 파일에서 정의됩니다 (이 맵은 여러 팩토리 메소드를 사용하여 생성됩니다).Autowiring Map이 예상대로 작동하지 않습니다.

내 디버거를 사용할 때, 나는지도가 제대로 (예상) 콩 ID를 사용하여 구성됩니다 볼 수 있습니다. 그러나 autowiring 프로세스가 시작되면, 방금 생성 된 id를 가진 bean을 찾을 수 없다고 주장합니다. 코드의

조각 : 상황에 맞는 XML의

@Autowired 
@Qualifier("dienstverbandMap") 
private Map<String, String> dienstverbandMap; 

조각 :

<bean class="java.util.HashMap" id="dienstverbandMap" factory-bean="someFactoryMethod" factory-method="getMappedMap"/> 

중요 세부 사항, 내 클래스와 상황에 맞는 XML이 모두 java.lang.Object 상위에 유형을 변경하는 경우 은 유선이됩니다 사실, 코드에서 HashMap으로 캐스팅하고 모든 것을 작동시킬 수 있습니다. 그러나 그것은 내가 분명히 원하는 것이 아닙니다.

사람은 내가 잘못 무엇 explantion있어?

답변

4

나는이 dienstverbandMap의 형태 파라미터를 함께 할 수있는 뭔가 생각합니다. 봄이 빈 인스턴스 (A HashMap가) 실제로 HashMap<String, String>로 인스턴스화 알아낼 수있는 경우 주입에만 안전하게 수행 할 수 있습니다. bean의 선언 된 타입이 raw 타입이기 때문에 Spring은 타입 파라미터를 잃어 버릴 수있다.

또 다른 가능성은 팩토리 메소드의 결과 서명이 잘못이다; 예 : HashMap 대신 맵을 사용하거나 HashMap<String, String>이 아닌 원시 HashMap을 사용하십시오.

은 (당신이 우리에게 팩토리 메소드의 선언을 보였다 경우 이러한 이론 중 일부는 반증 할 수있다.) 그런데


, 봄 콩 2.0 DTD 및 3.0 XSD의 주석에 따르면, factory-bean 특성을 제공하면 class 특성이 사용되지 않습니다. 당신은 그것을 완전히 버리려고 노력 했습니까?

+1

네 말이 맞아. 내 factory 메소드 시그니처는 Map <>을 반환하고,이를 HashMap으로 변경하면 모든 것이 작동하기 시작합니다. 감사!! :) –

+0

나는 반환 된 타입이 Map (또는 좀 더 구체적)이되도록 Interface를 구현했다. 그러나 그때조차도 작동하지 않았습니다. 이 기능을 사용하려면 인터페이스를 변경해야했습니다. Yuk :) –

0

나는 당신의 팩토리 메소드가 java.util.Map하지 java.util.HashMap을 반환 확실 해요, 그래서 아마 당신이 할 수있는 것 같아요 :

<bean class="java.util.Map" id="dienstverbandMap" 
     factory-bean="someFactoryMethod" factory-method="getMappedMap"/> 

면책 조항 : 봄은 당신이 Map으로 할 수 있도록한다면 잘 모르겠어요 인터페이스이지만 시도해 볼 가치가 있습니다.

+0

bean 유형을 java.util.Map으로 설정해 보았습니다. 그러나 아무 소용이 없습니다. 생각해 줘서 고마워. –

5

3.11.3. Fine-tuning annotation-based autowiring with qualifiers:

인용구 : 당신이 이름으로 주석 중심의 주입을 표현하려는 경우 는 주로 @Autowired를 사용하지 않는 - @Qualifier 값을 통해 빈 이름을 참조하는 기술적 할 경우에도 마찬가지입니다. 그 대신 고유 한 이름으로 특정 대상 구성 요소를 식별하기 위해의 미적으로 정의 된 JSR-250 @Resource 주석을 선호합니다. 선언 된 유형은 일치하는 프로세스와 관련이 없습니다. 타입 매칭이 적절히 적용되지 않기 때문에,이 의미 론적 차이의 결과로서 특정

는 자신이 수집 또는 맵 형식으로 정의 콩 @Autowired 통해 주입 될 수 없다. 고유 한 이름으로 특정 콜렉션/맵 bean을 참조하여 그러한 bean에 대해 @Resource를 사용하십시오.

+0

@Resource 주석과 관련하여 더 이상 권장할만한 문서가 있습니까? –

+1

참고로, 리소스 주석을 시도했을 때 Tomcat에서 제대로 작동했지만 JBoss에서는 작동하지 않았습니다. @Resource 주석 처리기는 플랫폼에 따라 다릅니다. – BillMan

0

맵의 bean 정의에는 유형 매개 변수가 없으므로 자동 배선이 올바른 유형인지는 확인할 수 없습니다.

<util:map>을 사용하는 경우 유형 매개 변수를 지정할 수는 있지만 사용자 고유의 팩토리 메소드를 사용할 수는 없습니다. 유일한 다른 해결책은 빈을 Map (나쁘다)으로 만들거나 빈 정의 (더 나은)에 맵을 명시 적으로 연결하도록 만드는 것이다.

관련 문제