JAXB Generation nillable = true

时间:2011-07-01 12:39:35

标签: java inheritance jaxb abstract

使用JAXB 2.2.4我使用以下绑定文件生成Java代码:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<globalBindings generateElementProperty="false">

</globalBindings>

不幸的是,生成的代码有一个nillable = true注释。请参阅以下示例:

@XmlElement(name = "ArtID", nillable = true)
protected STEBeitrag artID;

这是STEBeitrag的定义:

<xsd:complexType name="CT_Beitrag">
    <xsd:complexContent>
        <xsd:extension base="allgemein:CT_Objekt">
            <xsd:sequence>
                <xsd:element name="ArtID" type="daten:STE_Beitrag" minOccurs="0" maxOccurs="1" nillable="true"/></xsd:element>
            </xsd:sequence>
        </xsd:extension>
     </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="STE_Beitrag" abstract="true">
    <xsd:simpleContent>
     <xsd:extension base="xsd:string"/>
   </xsd:simpleContent>
</xsd:complexType>

如果我没有在生成的CT_Beitrag对象中设置ArtID,则unmarshaller会生成类似

的输出
<ns:ArtID xsi:nil="true"/>

元素ArtID具有抽象类型,因此该XML输出无效。

如何使用JAXB生成代码,忽略XmlElement注释中的nillable = true? 顺便说一下,架构不能改变。

2 个答案:

答案 0 :(得分:1)

我没有解决方案,但是这个问题很重要 http://java.net/jira/browse/JAXB-890 我希望这个问题能够得到解决。

答案 1 :(得分:0)

我不知道如何做你所要求的事情,如果你所要求的是值得的,我会感到惊讶。

我想到了两个选项:

  1. 更改架构(我知道你说你不能,但是如果由于它被托管在你控制之外的服务器上而无法改变它,你可能会获取架构的本地副本)。
  2. 更改生成的代码...只需将nillable=true更改为nillable=false
  3. 即可