从jaxb生成的代码中去掉JAXBElement



我有一个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>

现在突然间,理发师停止了工作。以下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>

但现在该类不再出现,jaxb将xml解组为具有Qname full-account-v2declaredType FullAccountV2TypeJAXBElement

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

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

我尝试在一个单独的xml文件中为元素声明定义类型,但得到了相同的结果。

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

注意,这似乎是这个问题的反面

更改为

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

现在,JAXB模式编译器将按照前面的FullAccountV2名称生成一个工件。

也可以使nametype具有相同的值,即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的任何内容来派生工件名称。

如果使用schemagen生成模式xsd,则这一点在其他情况下也很明显。例如,对于下面显示的类定义

@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>

注意,nametype具有相同的值,即默认情况下的类名。

最新更新