在Spring中需要多个相同类型的bean

dha*_*ram 24 java xml spring xsd spring-mvc

在将其标记为重复之前的请求.我已经通过论坛,无法在任何地方找到问题的解决方案.

我正在使用Spring 3.2编写代码,一切都是纯粹基于注释的.代码接收从不同XSD文件派生的XML文件.

所以我们可以说,有五种不同的XSD(A1,A2,A3,A4,A5),我的代码接收任何类型的XML,我有逻辑来识别到达时的XML类型.

现在,我试图使用Spring OXM解组这些.但由于涉及多个XSD,我们实际上无法使用一个Un-marshaller.所以我们需要大约五个.

Configuration课堂上,我添加了五个bean,如下所示:

@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");
}
Run Code Online (Sandbox Code Playgroud)

现在我有五个不同的类C1,C2,C3,C4和C5,我试图将一个unmarshaller bean注入一个类.这意味着A1Unmarshaller自动装配C1等等.

构建Spring上下文时,它会抛出一个错误,说它期望一个类型的bean Jaxb2Marshaller并且得到五个.

注意使用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;
}
Run Code Online (Sandbox Code Playgroud)

}

Bru*_*owe 49

您应该限定自动装配变量以说明应该注入哪一个

@Autowired
@Qualifier("A1Unmarshaller")
private Jaxb2Marshaller A1Unmarshaller;
Run Code Online (Sandbox Code Playgroud)

默认的自动装配是按类型而不是按名称,因此当存在多个相同类型的bean时,必须使用@Qualifier注释.


M. *_*num 5

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;
}
Run Code Online (Sandbox Code Playgroud)

这样,您只需要一个编组器/解组器。

链接

  1. Jaxb2Marshaller javadoc
  2. setContextPaths javadoc