正确的创建JAXB对象的方法

时间:2014-01-21 07:46:08

标签: java jaxb

我注意到jaxb编译器xjc生成的ObjectFactory类。我读了一些关于它的目的。

我想知道什么是创建jaxb对象的正确方法,因为我的目的根本不需要这个类。我是否应该总是使用ObjectFactory即使是普通的情况,或者我可以通过普通的构造函数构建对象(肯定能正常工作)?

编辑:添加示例:

我需要创建IpAddress

的实例

这是工厂方法:

  public IpAddress createIpAddress() {
        return new IpAddress();
    }

是否更好IpAddress ia = new IpAddress()

IpAddress ia = objectFactory.createIpdAddress()

2 个答案:

答案 0 :(得分:2)

如果使用ObjectFactory创建域对象的实例或仅使用JAXB 2 (JSR-222)中的零arg构造函数,则创建的实例之间没有区别。在JAXB 1 (JSR-031)而不是POJO中,JAXB会使用特定于供应商的impl类来创建创建的接口,然后需要ObjectFactory来创建实例。

有时,域对象需要包装在JAXBElement的实例中,ObjectFactory包含执行此操作的有用方法(请参阅:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html)。

JAXB最终需要

ObjectFactory来包含它所包含的元数据。在处理类时,JAXB将遍历传递依赖项。在ObjectFactory上使用create方法提供了一个JAXB可以用来处理整个模型的元数据的类。


更新

  

确定。那么最好的做法是什么才是正确的做法? (见我的   例如pls)

这取决于。我个人更喜欢使用构造函数。我在下面有一个例子来演示这两种方法。

XML架构

下面是我用来创建Java模型的XML Schema。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
    <xs:element name="root" type="root"/>
    <xs:complexType name="root">
        <xs:sequence>
            <xs:element name="foo">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="bar" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

演示代码

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

public class Demo {

    public static void main(String[] args) {
        // Using Constructors
        Root.Foo foo1 = new Root.Foo();
        foo1.setBar("Hello");
        Root root1 = new Root();
        root1.setFoo(foo1);
        JAXBElement<Root> jaxbElement1 = new JAXBElement<Root>(new QName("root"), Root.class, root1);


        // Using ObjectFactory
        ObjectFactory objectFactory = new ObjectFactory();
        Root.Foo foo2 = objectFactory.createRootFoo();
        foo2.setBar("World");
        Root root2 = objectFactory.createRoot();
        root2.setFoo(foo2);
        JAXBElement<Root> jaxbElement2 = objectFactory.createRoot(root2);
    }

}

答案 1 :(得分:0)

JAXB使用ObjectFactory来标识要绑定的类,例如

    JAXBContext ctx = JAXBContext.newInstance("test"); <-- test is package
    Marshaller m = ctx.createMarshaller();
    m.marshal(new X(), System.out);  <-- X is test package

引发

javax.xml.bind.JAXBException: "test" doesnt contain ObjectFactory.class or jaxb.index

但是

JAXBContext ctx = JAXBContext.newInstance(X.class);
...

工作正常,因为我们明确地将X加载到JAXBCOntext