Binding JAXB:作为枚举的匿名简单类型?
当通过XJC编译器从XSD生成Java时,对于具有匿名SimpleType的元素,我总是获得Java.lang.String类型,如下所示:Binding JAXB:作为枚举的匿名简单类型?,binding,xsd,jaxb,Binding,Xsd,Jaxb,当通过XJC编译器从XSD生成Java时,对于具有匿名SimpleType的元素,我总是获得Java.lang.String类型,如下所示: <xsd:element name="Product"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Product1"/>
<xsd:element name="Product">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Product1"/>
<xsd:enumeration value="Product2"/>
<xsd:enumeration value="Product3"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
当然,我想要一个枚举。有没有办法欺骗XJC生成并使用一个
我们正在使用JAXB2.1.3。
注意:在您提问之前,不,我无法更改模式并使其适应XJC的bug。我有一个非常类似的问题,我在JAXB邮件列表上提问并得到(但还没有时间尝试)
编辑:如果您谈论的是自动生成枚举类,而不仅仅是自动映射到您自己编写的枚举类,那么我认为您可以编写一个java类来解析模式文件并自动生成该枚举的java代码。(然后在调用xjc时运行该java类)您必须将以下内容放入xjc文件中:
<jxb:bindings node="//xsd:element[@name='Product']/xsd:simpleType">
<jxb:typesafeEnumClass name="ProductType" />
</jxb:bindings>
或
以下是我如何实现此功能的示例。为了完整性,我将添加整个xjb,因为我承认在查看现有示例时,我仍然觉得有点困惑 这是.xjb文件
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
jaxb:version="1.0">
<jaxb:bindings schemaLocation="search-constraints.xsd"
node="/xs:schema">
<jaxb:bindings node="//xs:simpleType[@name='booleanStringType']">
<jaxb:typesafeEnumClass name="BooleanStringType" />
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
在这里,绑定指的是在search-constraints.xsd的根级别声明的简单类型。以下是该文件的摘录:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com"
xmlns:tns="http://www.example.com"
elementFormDefault="qualified"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
...
<xs:simpleType name="booleanStringType">
<xs:restriction base="xs:string">
<xs:enumeration value="true" />
<xs:enumeration value="false" />
</xs:restriction>
</xs:simpleType>
...
我在没有定义自己的枚举类型的情况下成功地做到了这一点-请参阅我的答案。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com"
xmlns:tns="http://www.example.com"
elementFormDefault="qualified"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
...
<xs:simpleType name="booleanStringType">
<xs:restriction base="xs:string">
<xs:enumeration value="true" />
<xs:enumeration value="false" />
</xs:restriction>
</xs:simpleType>