Menu Close

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

概要

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

カスタマイズは、jaxb:typesafeEnumClass 要素と 1 つまたは複数の jaxb:typesafeEnumMember 要素を使用して行われます。

コードジェネレーターのデフォルト設定が列挙のすべてのメンバーに対して有効な 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 つの方法の 1 つでこの要素を使用できます。

  • 変更する 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>