38.4. 列挙マッピングのカスタマイズ

概要

xsd:string 以外のスキーマタイプに基づく列挙型が必要な場合は、コードジェネレーターにマップするように指示する必要があります。生成される列挙定数の名前を制御することもできます。

カスタマイズは、1 つ以上の jaxb:typesafeEnum Member 要素と共に jaxb:typesafeEnum Class 要素を使用して行われます。

コードジェネレーターのデフォルト設定では、列挙型のすべてのメンバーに対して有効な Java 識別子を作成できない場合もあります。globalBindings カスタマイズの属性を使用して、コードジェネレーターがこれを処理する方法をカスタマイズできます。

メンバー名カスタマイザー

列挙のメンバーを生成する際にコードジェネレーターが名前の競合に直面する場合や、列挙のメンバーに有効な Java 識別子を作成できない場合、デフォルトではコードジェネレーターが警告を生成し、列挙の Java enum 型を生成しません。

この動作は、globalBinding 要素の typesafeEnumMemberName 属性を追加することにより変更できます。typesafeEnumMemberName 属性の値については、表38.2「列挙型メンバー名の生成をカスタマイズするための値」 に記載されています。

表38.2 列挙型メンバー名の生成をカスタマイズするための値

説明

skipGeneration(デフォルト)

Java enum 型が生成されず、警告を生成することを指定します。

generateName

パターン VALUE_N に従ってメンバー名が生成されることを指定します。N は 1 から始まり、列挙のメンバーごとに増分されます。

generateError

列挙を Java enum 型にマッピングできない場合に、コードジェネレーターがエラーを生成することを指定します。

例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 要素内に配置する必要があります。

表38.3 生成された列挙型クラスをカスタマイズするための属性

属性説明

name

生成される Java enum 型の名前を指定します。この値は有効な Java 識別子である必要があります。

map

列挙を Java enum 型へマッピングすべきかどうかを指定します。デフォルト値は true です。

メンバーカスタマイザー

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>