[英]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.