38.4. 列挙マッピングのカスタマイズ
概要
xsd:string
以外のスキーマタイプに基づく列挙型が必要な場合は、コードジェネレーターにマップするように指示する必要があります。生成される列挙定数の名前を制御することもできます。
カスタマイズは、1 つ以上の jaxb:typesafeEnum Member
要素と共に jaxb:typesafeEnum Class
要素を使用して行われます。
コードジェネレーターのデフォルト設定では、列挙型のすべてのメンバーに対して有効な Java 識別子を作成できない場合もあります。globalBindings
カスタマイズの属性を使用して、コードジェネレーターがこれを処理する方法をカスタマイズできます。
メンバー名カスタマイザー
列挙のメンバーを生成する際にコードジェネレーターが名前の競合に直面する場合や、列挙のメンバーに有効な Java 識別子を作成できない場合、デフォルトではコードジェネレーターが警告を生成し、列挙の Java enum
型を生成しません。
この動作は、globalBinding
要素の typesafeEnumMemberName
属性を追加することにより変更できます。typesafeEnumMemberName
属性の値については、表38.2「列挙型メンバー名の生成をカスタマイズするための値」 に記載されています。
値 | 説明 |
---|---|
|
Java |
|
パターン |
|
列挙を Java |
例38.17「タイプセーフなメンバー名を強制するためのカスタマイズ」 は、コードジェネレーターにタイプセーフなメンバー名を生成させるインラインカスタマイズを示しています。
例38.17 タイプセーフなメンバー名を強制するためのカスタマイズ
<schema targetNamespace="http://widget.com/types/widgetTypes" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"> <annotation> <appinfo> <jaxb:globalBindings typesafeEnumMemberName="generateName" /> </appinfo> </annotation> ... </schema>
クラスカスタマイザ
jaxb:typesafeEnumClass
要素は、XML スキーマ列挙を Java enum
型にマッピングする必要があることを指定します。これには、表38.3「生成された列挙型クラスをカスタマイズするための属性」 で説明されている 2 つの属性があります。jaxb:typesafeEnumClass
要素がインラインで指定されている場合は、変更する単純型の xsd:annotation
要素内に配置する必要があります。
属性 | 説明 |
---|---|
|
生成される Java |
|
列挙を Java |
メンバーカスタマイザー
jaxb:typesafeEnumMember
要素は、XML スキーマ enumeration
ファセットと Java enum
型の定数の間のマッピングを指定します。カスタマイズする列挙では、enumeration
ごとに 1 つの jaxb:typesafeEnumMember
要素を使用する必要があります。
インラインカスタマイズを使用する場合、この要素は次の 2 つの方法のいずれかで使用できます。
-
変更する
enumeration
ファセットのxsd:annotation
要素内に配置することができます。 -
列挙のカスタマイズに使用される
jaxb:typesafeEnumClass
要素の子として、すべて配置することができます。
jaxb:typesafeEnumMember
要素には、必須の name
属性があります。name
属性は、生成される Java enum
型の定数の名前を指定します。その値は有効な Java 識別子でなければなりません。
jaxb:typesafeEnumMember
要素には、value
属性もあります。value
は、enumeration
ファセットを適切な jaxb:typesafeEnumMember
要素に関連付けるために使用されます。value
属性の値は、enumeration
ファセットの value
属性の値のいずれかと一致する必要があります。この属性は、型の生成をカスタマイズするために外部バインディング仕様を使用する場合や、jaxb:typesafeEnumMember
要素を jaxb:typesafeEnumClass
要素の子としてグループ化する場合に必要です。
例
例38.18「列挙型のインラインカスタマイズ」 は、インラインカスタマイズを使用し、列挙型のメンバーを個別にカスタマイズした列挙型を示しています。
例38.18 列挙型のインラインカスタマイズ
<schema targetNamespace="http://widget.com/types/widgetTypes" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"> <simpleType name="widgetInteger"> <annotation> <appinfo> <jaxb:typesafeEnumClass /> </appinfo> </annotation> <restriction base="xsd:int"> <enumeration value="1"> <annotation> <appinfo> <jaxb:typesafeEnumMember name="one" /> </appinfo> </annotation> </enumeration> <enumeration value="2"> <annotation> <appinfo> <jaxb:typesafeEnumMember name="two" /> </appinfo> </annotation> </enumeration> <enumeration value="3"> <annotation> <appinfo> <jaxb:typesafeEnumMember name="three" /> </appinfo> </annotation> </enumeration> <enumeration value="4"> <annotation> <appinfo> <jaxb:typesafeEnumMember name="four" /> </appinfo> </annotation> </enumeration> </restriction> </simpleType> <schema>
例38.19「結合マッピングを使用した列挙型のインラインカスタマイズ」 は、インラインカスタマイズを使用し、メンバーのカスタマイズをクラスのカスタマイズに組み合わせた列挙型を示しています。
例38.19 結合マッピングを使用した列挙型のインラインカスタマイズ
<schema targetNamespace="http://widget.com/types/widgetTypes" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"> <simpleType name="widgetInteger"> <annotation> <appinfo> <jaxb:typesafeEnumClass> <jaxb:typesafeEnumMember value="1" name="one" /> <jaxb:typesafeEnumMember value="2" name="two" /> <jaxb:typesafeEnumMember value="3" name="three" /> <jaxb:typesafeEnumMember value="4" name="four" /> </jaxb:typesafeEnumClass> </appinfo> </annotation> <restriction base="xsd:int"> <enumeration value="1" /> <enumeration value="2" /> <enumeration value="3" /> <enumeration value="4" > </restriction> </simpleType> <schema>
例38.20「列挙をカスタマイズするためのバインディングファイル」 は、列挙型をカスタマイズする外部バインディングファイルを示しています。
例38.20 列挙をカスタマイズするためのバインディングファイル
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0"> <jaxb:bindings schemaLocation="enumMap.xsd"> <jaxb:bindings node="xsd:simpleType[@name='widgetInteger']"> <jaxb:typesafeEnumClass> <jaxb:typesafeEnumMember value="1" name="one" /> <jaxb:typesafeEnumMember value="2" name="two" /> <jaxb:typesafeEnumMember value="3" name="three" /> <jaxb:typesafeEnumMember value="4" name="four" /> </jaxb:typesafeEnumClass> </jaxb:bindings> </jaxb:bindings> <jaxb:bindings>