从jaxb生成的代码中删除JAXBElement?

时间:2016-04-13 23:10:09

标签: java xml xsd jaxb

我有一个xsd,我从中生成一些java代码:

<xs:element name="full-account-v2" >
  <xs:complexType>
    <xs:sequence>
        <xs:element name="ban" type="xs:string" />
        <xs:element name="status" type="xs:int" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

这个工作正常,给了我一个名为FullAccountV2的生成类。

我想在其他地方使用相同的复杂类型,所以我想我会在xsd文件中创建一个命名的复杂类型,并像这样引用它:

<xs:element name="full-account-v2" type="fullAccountV2Type"/>

复杂类型定义如下:

<xs:complexType name="fullAccountV2Type">
    <xs:sequence>
        <xs:element name="ban" type="xs:string" />
        <xs:element name="status" type="xs:int" />
    </xs:sequence>
</xs:complexType>

现在突然,unmarshaller停止工作。以下xml对FullAccountV2进行了解组:

<er-response id="100058" version="2">
  <payload>
   <full-account-v2>
    <ban>BAN_P146058461158163004</ban>
     <status>401</status>
   </full-account-v2>
  </payload>
</er-response>

但是现在该类不再出现了,并且xml被jaxb解组为JAXBElement Qname full-account-v2declaredType FullAccountV2Type

ErResponse和Payload在其他地方定义为:

<xs:complexType name="payloadType">
    <xs:sequence>
        <xs:any processContents="lax" minOccurs="0" />
    </xs:sequence>
</xs:complexType>

我尝试将单独的xml文件中的类型定义为元素声明,但结果相同。

这么简单的重构怎么能让我经历8个小时的挣扎?我做错了什么?

注意,这似乎是this problem

的倒数

1 个答案:

答案 0 :(得分:0)

更改为

if

现在,JAXB模式编译器将如前所述通过<xs:element name="full-account-v2" type="fullAccountV2" /> <xs:complexType name="fullAccountV2"> <xs:sequence> <xs:element name="ban" type="xs:string" /> <xs:element name="status" type="xs:int" /> </xs:sequence> </xs:complexType> 名称生成工件。

FullAccountV2name具有相同的值,即type也是可以的。以下更改也可以正常工作 -

FullAccountV2

上面的模式定义也会像之前一样生成工件<!-- one is element and other is complexType --> <xs:element name="fullAccountV2" type="fullAccountV2" /> <xs:complexType name="fullAccountV2"> <xs:sequence> <xs:element name="ban" type="xs:string" /> <xs:element name="status" type="xs:int" /> </xs:sequence> </xs:complexType> 。我们分配给FullAccountV2的任何内容都由模式编译器用于派生工件名称。

如果您使用type生成架构xsd,这也是显而易见的。例如 - 对于下面显示的类定义

schemagen

@XmlRootElement public class Pojo { public Pojo p; } 生成以下架构定义

schemagen

注意,<xs:element name="pojo" type="pojo"/> <xs:complexType name="pojo"> <xs:sequence> <xs:element name="p" type="pojo" minOccurs="0"/> </xs:sequence> </xs:complexType> name具有相同的值,默认为类名。