如何使用Jaxb生成的ObjectFactory?

时间:2013-01-19 06:02:31

标签: jaxb createinstance objectfactory

我正在使用Jaxb生成Java类。我的架构定义了以下元素:

<xs:complexType name="AutomobileType" abstract="true">
    <xs:sequence>
        <xs:element name="Color" type="core:ColorName"/>
        <xs:element name="Weight" type="core:PoundsWeightType"/>
        <xs:element name="Fuel" type="Fuel"/>
        <xs:element name="NumDoors" type="xs:nonNegativeInteger"/>
        <xs:element name="NumCylinders">
            <xs:simpleType>
                <xs:restriction base="xs:int">
                    <xs:minInclusive value="1"/>
                    <xs:maxInclusive value="12"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>    
<xs:element name="Automobile" type="AutomobileType"/>

如您所见,我有一个名为 Automobile 的元素。

Jaxb创建了一个类和一个 ObjectFactory ,用于创建 Automobile 的实例。令我感到困惑的是创建 Automobile 实例的方法如下:

public JAXBElement<AutomobileType> createAutomobile(AutomobileType value)

为什么 createAutomobile 方法有参数?我该如何使用这种方法?

我尝试了以下内容:

ObjectFactory objectFactory = new ObjectFactory();
objectFactory.createAutomobile(new Automobile());

但是这不能编译,因为 Automobile 类是抽象的,因此我无法创建实例。

1 个答案:

答案 0 :(得分:2)

还有另一种方法:

 public AutomobileType createAutomobileType();

在JAXB中,xsd:complexType“AutomobileType”构造映射了同名的类。它意味着数据结构等同于XML模式类型。

JAXBElement&lt;&gt;是一个(参数化的)包装类型,它将java对象与元素名称和命名空间相关联,这就是为什么它的构造函数除了元素名称空间和元素名称之外还将一个AutomobileType对象作为构造函数中的参数。 生成的ObjectFactory“createAutomobile(..)”只是一种方便的方法来包装该构造函数,从XML模式中对命名空间和元素名称进行硬编码。

虽然这种二分法一开始并不是全部直截了当,但考虑到你可以用另一个名字来获得另一个元素

它们在结构上是等价的,但元素名称会有所不同。你会有另一个ObjectFactory方法“createMotorcycle(...)”。

您可以创建一个未命名的automobileType对象,以构建xml元素的内容,然后告诉JAXB它应该表示哪个XML元素。

我不能建议阅读有关该主题的JAXB文档。