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