Java 创建JAXB对象的正确方法

Java 创建JAXB对象的正确方法,java,jaxb,Java,Jaxb,我注意到jaxb编译器xjc生成的ObjectFactory类。我读了一些关于它的目的的东西 我想知道创建jaxb对象的正确方法是什么,因为出于我的目的,我根本不需要这个类。我是否应该始终使用ObjectFactory,即使是在很小的情况下,还是可以通过普通的构造函数来构造对象(什么方法确实有效) 编辑:添加示例: 我需要创建IpAddress的实例 这是工厂方法: public IpAddress createIpAddress() { return new IpAddre

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

我想知道创建jaxb对象的正确方法是什么,因为出于我的目的,我根本不需要这个类。我是否应该始终使用
ObjectFactory
,即使是在很小的情况下,还是可以通过普通的构造函数来构造对象(什么方法确实有效)

编辑:添加示例:

我需要创建
IpAddress的实例

这是工厂方法:

  public IpAddress createIpAddress() {
        return new IpAddress();
    }
更好吗
IpAddress ia=new IpAddress()


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

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


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

如果使用
ObjectFactory
创建域对象的实例,或者只使用中的零参数构造函数,则创建的实例之间没有区别。在pojo中,JAXB impls使用特定于供应商的impl类创建接口,而不是pojo,当时需要
ObjectFactory
来创建实例

有时需要将域对象包装到
JAXBElement
的实例中,
ObjectFactory
包含了执行此操作的有用方法(请参阅:)

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


更新
嗯。那么,从最佳实践的角度来看,正确的方法是什么?(见我的 示例(pls)

这要看情况而定。就我个人而言,我更喜欢使用构造函数。我下面有一个例子演示了这两种方法

XML模式

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


演示代码

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

}
import javax.xml.bind.JAXBElement;
导入javax.xml.namespace.QName;
公开课演示{
公共静态void main(字符串[]args){
//使用构造函数
Root.Foo foo1=新的Root.Foo();
foo1.挫折(“你好”);
根根1=新根();
root1.setFoo(foo1);
JAXBElement-jaxbElement1=新的JAXBElement(新的QName(“根”),root.class,root1);
//使用ObjectFactory
ObjectFactory ObjectFactory=新的ObjectFactory();
Root.Foo foo2=objectFactory.createRootFoo();
二、挫折(“世界”);
Root root2=objectFactory.createRoot();
root2.setFoo(foo2);
JAXBElement-jaxbElement2=objectFactory.createRoot(root2);
}
}

可能重复我的问题与我添加到问题中的示例中的情况有关。确定。那么,从最佳实践的角度来看,正确的方法是什么?(请看我的例子)@LeNoob-是的,两种方法都可以。
javax.xml.bind.JAXBException: "test" doesnt contain ObjectFactory.class or jaxb.index
JAXBContext ctx = JAXBContext.newInstance(X.class);
...
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);
    }

}