복붙노트

[SPRING] 필수 스프링에서 동일한 유형의 여러 빈

SPRING

필수 스프링에서 동일한 유형의 여러 빈

요청을 중복으로 표시하기 전에 요청하십시오. 나는 포럼을 거쳐 어디서나 문제의 해결책을 찾지 못했습니다.

나는 Spring 3.2를 사용하여 코드를 작성하고 있으며, 모든 것은 순전히 주석 기반이다. 이 코드는 다른 XSD 파일에서 파생 된 XML 파일을받습니다.

우리가 말할 수있는 것은 다섯 가지 다른 XSD (A1, A2, A3, A4, A5)가 있고 어떤 식 으로든 XML을받는 코드이고 도착시 XML 형식을 식별하는 논리가 있습니다.

이제, 나는 Spring OXM을 사용하여 이들을 un-marshal하려고 노력 중이다. 그러나 여러 개의 XSD가 관련되어 있기 때문에 Un-marshaller를 실제로 사용할 수는 없습니다. 그래서 우리는 5 명 정도가 필요합니다.

Configuration 클래스에서 아래와 같이 다섯 개의 빈을 추가했다.

@Bean(name="A1Unmarshaller")
public Jaxb2Marshaller A1Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A1");
}

@Bean(name="A2Unmarshaller")
public Jaxb2Marshaller A1Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A2");
}

@Bean(name="A3Unmarshaller")
public Jaxb2Marshaller A3Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A3");
}

@Bean(name="A4Unmarshaller")
public Jaxb2Marshaller A4Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A4");
}

@Bean(name="A5Unmarshaller")
public Jaxb2Marshaller A5Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A5");
}

이제는 다섯 가지 클래스 C1, C2, C3, C4 및 C5가 있으며 하나의 클래스에 하나의 unmarshaller bean을 주입하려고합니다. 이는 A1Unmarshaller가 C1에 자동으로 연결된다는 것을 의미합니다.

Spring 컨텍스트가 빌드 될 때, Jaxb2Marshaller 타입의 bean 하나를 기대하고 5가 있다는 에러를 발생시킨다.

참고 XML 구성을 사용하면 제대로 작동하므로 뭔가 누락 된 것인지 확실하지 않습니다. 도와주세요.

편집 C1 클래스 중 하나에 대한 코드는 아래 있습니다 :

@Component
public class C1{

@Autowired
private Jaxb2Marshaller A1Unmarshaller;
    A1 o = null

public boolean handles(String event, int eventId) {
    if (null != event&& eventId == 5) {
                A1 =  A1Unmarshaller.unMarshal(event);
        return true;
    }
    return false;
}

}

해결법

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

    1.autowired 변수에 어떤 변수를 주입해야하는지 명시해야합니다

    autowired 변수에 어떤 변수를 주입해야하는지 명시해야합니다

    @Autowired
    @Qualifier("A1Unmarshaller")
    private Jaxb2Marshaller A1Unmarshaller;
    

    기본 autowiring은 이름이 아닌 유형별로 이루어 지므로 동일한 유형의 bean이 두 개 이상있는 경우 @Qualifier 주석을 사용해야합니다.

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

    2.@Resource 주석을 사용하는 삽입이 당신이 찾고있는 것입니다. 당신이 사용할 수있는

    @Resource 주석을 사용하는 삽입이 당신이 찾고있는 것입니다. 당신이 사용할 수있는

    @AutoWired
    @Qualifier("A1Unmarshaller")
    private Jaxb2Marshaller A1Unmarshaller;
    

    그러나 이것이 유일한 방법은 아닙니다.

    @Resource("A1Unmrshaller")
    

    그 일도 하느냐. 나는 당신이 나중에 하나를 사용하는 것이 좋습니다! 이유보기

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

    3.Jaxb2Marshaller는 여러 다른 컨텍스트 / xsd를 완벽하게 사용할 수 있습니다. setContextPaths 메소드를 사용하여 여러 컨텍스트 경로를 지정하기 만하면됩니다.

    Jaxb2Marshaller는 여러 다른 컨텍스트 / xsd를 완벽하게 사용할 수 있습니다. setContextPaths 메소드를 사용하여 여러 컨텍스트 경로를 지정하기 만하면됩니다.

    @Bean(name="A1Unmarshaller")
    public Jaxb2Marshaller A1Unmarshaller(){
        Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
        unMarshaller.setContextPaths(
            "package name for the classes generate by XSD A1",
            "package name for the classes generate by XSD A2",
            "package name for the classes generate by XSD A3",
            "package name for the classes generate by XSD A4",
            "package name for the classes generate by XSD A5" );
        return unMarshaller;
    }
    

    그렇게하면 마샬 러 / 언 마샬 러가 하나만 필요합니다.

    모래밭

  4. from https://stackoverflow.com/questions/18711924/required-multiple-beans-of-same-type-in-spring by cc-by-sa and MIT license