先週に引きつづき,今週もJAXBで使われるアノテーションを紹介していきます。今週は列挙型を修飾するアノテーションと,フィールド/プロパティを修飾するアノテーションです。

その後,実際にJavaのクラスからスキーマを生成させる方法を紹介します。

列挙型を修飾するアノテーション

列挙型は特殊なクラスなので,クラスを修飾するアノテーションはすべて使用することができます。それ以外に@XmlEnumと@XmlEnumValueが使用できます。

表1 列挙型を修飾するアノテーション
アノテーション名 説明/デフォルト値
@XmlEnum クラスをスキーマの型に対応づける
@XmlEnum(
  value=String.class
)
@XmlEnumValue 値をスキーマの型に対応づける
なし
@XmlType クラスをスキーマの型に対応づける
@XmlType(
  name="##default",
  propOrder={""},
  namespace="##default",
  factoryClass=DEFAULT.class,
  factoryMethod=""
)
@XmlRootElement クラスをスキーマの宣言に対応づける
@XmlRootElement(
  name="##default",
  namespace="##default"
)
@XmlAccessorType フィールド,プロパティの対応を決定する
@XmlAccesorType(
  namespace="http://www.w3.org/2001/XMLSchema",
  type=DEFAULT.class
)
@XmlAccessorOrder フィールド,プロパティの対応順序を決める
なし

@XmlEnum

@XmlEnumは,列挙型をXML Schemaで定義された型に対応づけるために使用します。デフォルトは文字列です。

例として血液型を表す列挙型を使用します。

@XmlEnum(String.class)
@XmlType
public enum BloodType {
    A, B, O, AB
}

@XmlEnumの要素に使用するクラスオブジェクトを指定します。上記のソースでは文字列(String.class)を使用しています。

文字列の場合,XML Schemaに対応するのはnameメソッドの戻り値です。たとえば,BloodType.AはBloodType.A.name()がスキーマで使用されます。

  <xs:simpleType name="bloodType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="A"/>
      <xs:enumeration value="B"/>
      <xs:enumeration value="O"/>
      <xs:enumeration value="AB"/>
    </xs:restriction>
  </xs:simpleType>

列挙型は,simpleTypeとenumerationで表されます。ここでは,@XmlEnum(String.class)と指定したので,文字列で表されています。

@XmlEnumの要素に文字列以外を使用したい場合,@XmlEnumValueと組み合わせて使用します。

たとえば,血液型を整数で表す場合には次のようにします。

@XmlEnum(Integer.class)
@XmlType
public enum BloodType {
    @XmlEnumValue("1") A,
    @XmlEnumValue("2") B,
    @XmlEnumValue("3") O,
    @XmlEnumValue("4") AB
}

@XmlEnumで使用するクラスを指定し,値をそのクラスの文字列表現で修飾します。

この列挙型に対応するXML Schemaを次に示します。

  <xs:simpleType name="bloodType">
    <xs:restriction base="xs:int">
      <xs:enumeration value="1"/>
      <xs:enumeration value="2"/>
      <xs:enumeration value="3"/>
      <xs:enumeration value="4"/>
    </xs:restriction>
  </xs:simpleType>

型がintになり,@XmlEnumValueで指定した値が使用されていることが分かります。