我注意到jaxb编译器xjc生成的ObjectFactory
类。我读了一些关于它的目的。
我想知道什么是创建jaxb对象的正确方法,因为我的目的根本不需要这个类。我是否应该总是使用ObjectFactory
即使是普通的情况,或者我可以通过普通的构造函数构建对象(肯定能正常工作)?
编辑:添加示例:
我需要创建IpAddress
这是工厂方法:
public IpAddress createIpAddress() {
return new IpAddress();
}
是否更好IpAddress ia = new IpAddress()
或
IpAddress ia = objectFactory.createIpdAddress()
答案 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)。
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