先週,スキーマからJavaへのバインディングをカスタマイズする方法を紹介しました。今週は,実際にどのようなカスタマイズが可能なのか見ていくことにしましょう。

グローバルカスタマイズ

グローバルカスタマイズは,xjcの対象となるすべてのスキーマに対するカスタマイズです。グローバルカスタマイズを行なうのが,<globalBindings>要素です。

<globalBindings>要素は<schema>要素に対して記述します。<globalBindings>要素は多くの属性を持ち,属性を指定することでカスタマイズを行ないます。

表1に<globalBindings>要素の属性を示しました。

表1 <globalBindings>要素の属性
属性名 取りうる値 デフォルト値
collectionType "コレクションで使用するクラス" "java.util.List"
fixedAttribute
AsConstantProperty
"true" | "false" | "1" | "0" "false"
generateIsSetMethod "true" | "false" | "1" | "0" "false"
enableFailFastCheck "true" | "false" | "1" | "0" "false"
choiceContentProperty "true" | "false" | "1" | "0" "false"
underscoreBinding "asWordSeparator" | "asCharInWord" "asWordSeparator"
typesafeEnumBase "タイプセーフEnumのベースとなる型" "xs:string"
typesafeEnumMemberName "skipGeneration" | "generateName" | "generateError" "skipGeneration"
typesafeEnumMaxMembers "intの数字" "256"
enableJavaNaming
Conventions
"true" | "false" | "1" | "0" "true"
generateElementClass "false" | "true" | "0" | "1" "false"
generateElementProperty "false" | "true" | "0" | "1" なし
generateValueClass "true" | "true" | "0" | "1" "true"
optionalProperty "wrapper" | "primitive" | "isSet" "wrapper"
mapSimpleTypeDef "true" | "false" | "1" | "0" "false"
localScoping "nested" | "toplevel" "nested"

主な属性を紹介しましょう。

collectionTypeは生成したクラスで使用するコレクションクラスを指定します。たとえば,次のようなスキーマを考えてみます。

<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="persons">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" 
                    type="xs:string"
                    maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

このスキーマから生成したPersonsクラスは次のようになります。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "name"
})
@XmlRootElement(name = "persons")
public class Persons {

    @XmlElement(required = true)
    protected List<String> name;
 
    public List<String> getName() {
        if (name == null) {
            name = new ArrayList<String>();
        }
        return this.name;
    }

}

赤字で示したように,java.util.ArrayListクラスが使用されます。