春季需要多种相同类型的豆子

2022-09-01 05:36:29

在将其标记为重复之前的请求。我已经浏览了论坛,在任何地方都找不到问题的解决方案。

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

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

现在,我正在尝试使用Spring OXM取消封送它们。但是由于涉及多个 XSD,我们实际上不能使用一个 Un-marshaller。因此,我们需要大约五个。

在课堂上,我添加了五个豆子,如下所示: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 A2Unmarshaller(){
    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注入一个类中。这意味着是自动连接到等等。A1UnmarshallerC1

当Spring上下文构建时,它会抛出一个错误,说它期望一个类型的豆子并得到五个。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;
}

}


答案 1

您应该限定自动连接的变量,以说明应该注入哪一个

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

默认的自动布线是按类型,而不是按名称,因此当有多个相同类型的Bean时,您必须使用@Qualifier注释。


答案 2

它完全能够处理多个不同的上下文/ xsd。只需使用 setContextPaths 方法指定多个上下文路径即可。Jaxb2Marshaller

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

这样,您只需要一个编组/取消编组。

链接

  1. Jaxb2Marshaller javadoc
  2. setContextPaths javadoc

推荐