9

通过使用 XJC,我创建了 2 个不同的 JAXB 元数据包,每个包中都有一个 ObjectFactory 类(我不知道这种方法是否可行,我有 2 个不同的 XSD 可以处理)

建议每个操作只创建一个 JAXBContext,因为它很昂贵。所以我想知道我在这里所做的是否有效且良好的做法?

    JAXBContext jaxbContext = JAXBContext.newInstance("com.package.one");
    Unmarshaller jaxbUnmarshaller1 = jaxbContext.createUnmarshaller();

    JAXBContext jaxbContext2 = JAXBContext.newInstance("com.package.two");
    Unmarshaller jaxbUnmarshaller2 = jaxbContext2.createUnmarshaller();

编辑当我尝试一起初始化 2 个包时,我得到一个异常“元素名称 {}Value 有多个映射。” 值是两个包中的一个类。

 JAXBContext jaxbContext = JAXBContext.newInstance("com.package.one:com.package.two");
4

1 回答 1

23

来自 JAXBContext 的 Javadoc:

客户端应用程序通常使用其中一种获取此类的新实例
newInstance 方法有两种样式,尽管还有其他特殊形式的
可用方法:

JAXBContext.newInstance("com.acme.foo:com.acme.bar")
JAXBContext 实例是从冒号分隔的 Java 包列表中初始化的
名字。每个 java 包都包含 JAXB 映射类、模式派生类和/或
用户注释类。此外,java 包可能包含 JAXB 包注释
必须处理。(参见 JLS 第 3 版,第 7.4.1 节。包注释)。

JAXBContext.newInstance(com.acme.foo.Foo.class)
JAXBContext 实例使用作为参数传递的类进行初始化,并且
可以从这些类静态访问的类。见 newInstance(Class...)
详情。

您可以使用共享上下文并使用包名称列表对其进行初始化。

代码示例:

package test.jaxb.one;

@XMLRootElement
@XMLType(name = "test.jaxb.one.SimpleObject")
@XMLAccessorType(XMLAccessType.FIELD)
public class SimpleObject implements Serializable {
    private static final long serialVersionUID = 54536613717262557148L;

    @XmlElement(name = "Name")
    private String name;

    // Constructor, Setters/Getters
}

和这个:

package test.jaxb.two;

@XMLRootElement
@XMLType(name = "test.jaxb.two.SimpleObject")
@XMLAccessorType(XMLAccessType.FIELD)
public class SimpleObject implements Serializable {
    private static final long serialVersionUID = -4073071224211934153L;

    @XmlElement(name = "Name")
    private String name;

    // Constructor, Setters/Getters
}

最后:

public class JAXBTest {
    @Test
    public void testContextLoad() throws Exception {
        final JAXBContext context = JAXBContext
            .newInstance("test.jaxb.one:test.jaxb.two");
        Assert.assertNotNull(context);
    }
}
于 2012-11-15T14:37:39.463 回答