绑定 - JAXB:XJC不为属性生成Enum类

时间:2012-04-05 16:40:59

标签: binding jaxb enumeration xjc complextype

我对XJC工具有一个问题,即它没有使用此模式为属性myEnum生成Enum类。

<xs:element name="myClass"> 
<xs:complexType>
    <xs:attribute name="myEnum" >
            <xs:simpleType >
                <xs:restriction base="xs:string">
                    <xs:maxLength value="1"/>
                    <xs:enumeration value="C"/>
                    <xs:enumeration value="M"/>
                    <xs:enumeration value="S"/>
                </xs:restriction>
            </xs:simpleType>
    </xs:attribute>
</xs:complexType>
</xs:element>

但如果我只使用此

,则会生成它
<xs:simpleType >
<xs:restriction base="xs:string">
    <xs:maxLength value="1"/>
    <xs:enumeration value="C"/>
    <xs:enumeration value="M"/>
    <xs:enumeration value="S"/>
</xs:restriction>
</xs:simpleType>

这是外部绑定文件内容:

<?xml version="1.0" encoding="UTF-8" ?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
     version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     > 
<globalBindings typesafeEnumMemberName="generateName">

</globalBindings>  
</bindings> 

1 个答案:

答案 0 :(得分:2)

您可以尝试这样做:定义一个小的XSD文件,只使用声明为全局类型的特定类型,例如:

<xs:simpleType name="myEnumSimpleType">
     <xs:restriction base="xs:string">
         <xs:maxLength value="1"/>
         <xs:enumeration value="C"/>
         <xs:enumeration value="M"/>
         <xs:enumeration value="S"/>
     </xs:restriction>
</xs:simpleType>

<xs:element name="myClass"> 
    <xs:complexType>
        <xs:attribute name="myEnum" type="myEnumSimpleType">
    </xs:complexType>
</xs:element>

这将生成一个JAXB类(让我们称之为&#39;人工JAXB类)。

然后,您可以在较大的XSD上运行xjc并自定义生成,以便为特定元素使用此类型。

或者,如果来自此外部XSD的JAXB生成是一次性操作(然后您将JAXB生成的代码放在SVN / Git中),那么您可以重写该代码的一部分以使用您的&#39;人工&#39;而是JAXB类型。

您可能想要尝试的另一种方法是进行绑定自定义

<globalBindings typesafeEnumMemberName="generateName"> 

不是全局的,但是使用表达式试图在这种类型上完全确定它。 JAXB可能会为每次出现生成一个新类,即使它们将是相同的。

因为我觉得xpath很乏味,所以我会在那个用命名空间修改的大XSD的本地副本上快速测试它,例如:

<xs:element name="myClass"> 
   <xs:complexType>
     <xs:attribute name="myEnum" >
        <xs:simpleType >
                <xs:annotation>
                    <xs:appinfo>
                        <jaxb:typesafeEnumClass/>
                    </xs:appinfo>
                </xs:annotation>                <xs:restriction base="xs:string">
                <xs:maxLength value="1"/>
                <xs:enumeration value="C"/>
                <xs:enumeration value="M"/>
                <xs:enumeration value="S"/>
            </xs:restriction>
        </xs:simpleType>
     </xs:attribute>
   </xs:complexType>
</xs:element>