2013-01-19 50 views
3

我正在使用Jaxb来生成Java类。我的架构定义了以下元素:如何使用由Jaxb生成的ObjectFactory?

<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"/> 

正如你所看到的,我只有一个单元叫汽车

Jaxb创建类和一个ObjectFactory,我用它来创建实例汽车。这令我感到困惑是创建汽车的实例方法的事情如下:

public JAXBElement<AutomobileType> createAutomobile(AutomobileType value) 

为什么createAutomobile方法有一个说法?我如何使用这种方法?

我试过如下:

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

但这并不编译,因为汽车类是抽象的,所以我不能创建一个实例。

+0

我将Automobile类更改为Not be Abstract,现在一切正常。但是,当我尝试编组汽车实例时,出现以下错误:无法编组类型“com.cookmv.dealership.vehicles.schemas.automobile.AutomobileType”作为元素,因为它缺少@XmlRootElement注释] –

回答

2

还有另一种方法:

public AutomobileType createAutomobileType(); 

在JAXB,所述XSD:复杂类型 “AutomobileType” 构建映射类的同名。它意味着与该XML模式类型等效的数据结构。

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

虽然这种二分法是不是首先向前伸直,考虑您可以用另一个名字

他们会在结构上相当于有另一个元素,但该元素的名称会有所不同。你会有另一个ObjectFactory方法“createMotorcycle(...)”。

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

我不能推荐阅读关于该主题的JAXB文档。

+0

我的ObjectFactory只有1个方法。它没有* no参数*方法createAutomobileType()。 –

+2

这可能与complexType上的abstract =“true”有关。我敢打赌,如果你把它设置为假,你会明白的。你碰巧有具体的子类型定义?如果是这样,您将在ObjectFactory中拥有相应的create方法,并且JAXB类型也将是abstract AutomobileType类的子类型,这意味着您可以将实例传递给createAutomobile(AutomobileType)方法。 JAXB非常紧密地映射了两个构造的语义。 –

+0

就是这样!谢谢! –

相关问题