繁体   English   中英

使用JAXB生成类时对xsd:union进行自定义(un)编组

[英]Custom (un)marshalling for xsd:union when genereting classes using JAXB

我正在开发一个通过发送和接收XML消息进行通信的应用程序。 这些消息在XSD架构中定义。 现在,我们希望拥有该架构,以便将来在不完全破坏客户端的情况下,我们可以轻松地对其进行更新。 我已经通过将<anyAttribute>元素添加到适当的位置<anyAttribute>解决了大多数问题。 但是我对<enumeration>元素有很大的问题。

这个想法是使用这样的东西:

<xsd:simpleType name="MyFruitEnumType">
    <xsd:restriction base="xsd:string">
         <xsd:enumeration value="APPLE"/>
         <xsd:enumeration value="ORANGE"/>
    </xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="MyFruitType">
    <xsd:union memberTypes="MyFruitEnumType xs:string"/>
</xsd:simpleType>

<xsd:element name="Fruit" type="MyFruitType"/>

实际上,将不使用xs:string ,但是当我们像这样更新架构时:

<xsd:simpleType name="MyFruitEnumType">
    <xsd:restriction base="xsd:string">
         <xsd:enumeration value="APPLE"/>
         <xsd:enumeration value="ORANGE"/>
         <xsd:enumeration value="BANANA"/>
    </xsd:restriction>
</xsd:simpleType>

我们可以用创建消息

<Fruit>BANANA</fruit>

并且它仍将使用旧架构通过验证(尽管在这种情况下,客户端应用将具有一些默认或错误行为)。

但是,当我们使用JAXB的xjc生成类时,就会出现问题。 <xsd:union>Fruit类中作为Java的String属性被生成。 它具有明显的默认行为,但我想对其进行自定义,因此Fruit类将使用enum MyFruitEnumType 当字符串不匹配任何enumeration的XML到达XML时,我并不关心这种情况。 例如,抛出某种验证异常对我来说很好(或者它可以将未知字符串映射到某个默认值,等等)。

我知道JAXB的<typesafeEnumMember>但是我不认为我可以在这里使用它(或者我不知道如何使用)。 我也考虑过<javaType parseMethod=... printMethod=...> ,但是我需要为已有的几十个枚举编写方法,因为我无法将枚举本身传递给parse和print方法来使用枚举的valueOf()方法的优点。

综上所述,问题是: 我可以自定义xsd:union如何转换为Java类变量吗?

所以最后,我在xjb文件中声明了绑定,如下所示:

<bindings node="//xs:simpleType[@name='MyFruitType']">
    <javaType name="com.example.MyFruitEnumType"/>
</bindings>

我创建了自定义JAXB插件,该插件可自定义xjc生成的XmlAdapter以与枚举一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM