2

このスキーマを使用して属性 myEnum の Enum クラスを生成しない XJC ツールに問題があります。

<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> 
4

1 に答える 1

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クラスが生成されます(これを「人工JAXBクラス」と呼びましょう)。

次に、より大きなXSDでxjcを実行し、特定の要素にこのタイプを使用するように生成をカスタマイズできます。

または、この外部XSDからのJAXB生成が1回限りの操作である場合(たとえば、JAXBで生成されたコードをSVN / Gitに配置する場合)、コードのその部分を「人工」を使用するように書き直すことができます。代わりに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>
于 2012-04-05T23:07:15.680 に答える