35

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

我正在使用 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 注入一个类。这意味着A1Unmarshaller自动连接到C1等等。

构建 Spring 上下文时,它会抛出一个错误,说它需要一个类型的 beanJaxb2Marshaller并得到五个。

注意使用 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;
}

}

4

3 回答 3

79

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

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

默认的自动装配是按类型,而不是按名称,所以当有多个相同类型的 bean 时,您必须使用 @Qualifier 注解。

于 2013-09-10T08:09:19.417 回答
10

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

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

链接

  1. Jaxb2Marshaller javadoc
  2. setContextPaths javadoc
于 2013-09-10T09:14:40.870 回答
4

@Resource您正在寻找使用注释的注入。您可以使用

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

但这不是唯一的方法。

@Resource("A1Unmrshaller")

也做这份工作。我建议你使用后者!看看为什么

于 2017-04-18T14:46:42.950 回答