第38章 タイプの生成方法のカスタマイズ

概要

デフォルトの JAXB マッピングは、XML スキーマを使用して Java アプリケーションのオブジェクトを定義するときに発生するほとんどのケースに対応しています。デフォルトのマッピングが不十分な場合、JAXB は広範なカスタマイズメカニズムを提供します。

38.1. タイプマッピングのカスタマイズの基本

概要

JAXB 仕様は、Java タイプを XML スキーマ構造にマップする方法をカスタマイズするいくつかの XML 要素を定義しています。これらの要素は、XML スキーマ構造とインラインで指定できます。XML スキーマ定義を変更できない、または変更したくない場合は、外部バインディングドキュメントでカスタマイズを指定できます。

Namespace

JAXB データバインディングのカスタマイズに使用される要素は、namespace http://java.sun.com/xml/ns/jaxb で定義されます。例38.1「JAXB カスタマイズ名前空間」 に示すような名前空間宣言を追加する必要があります。これは、JAXB のカスタマイズを定義するすべての XML ドキュメントのルート要素に追加されます。

例38.1 JAXB カスタマイズ名前空間

xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"

バージョン宣言

JAXB カスタマイズを使用する場合は、使用されている JAXB バージョンを指定する必要があります。これには、外部バインディング宣言のルート要素に jaxb:version 属性を追加します。インラインのカスタマイズを使用している場合、カスタマイズを含む schema 要素 に jaxb:version 属性を含める必要があります。属性の値は常に 2.0 です。

例38.2「JAXB カスタマイズバージョンの指定」 に、schema 要素で使用される jaxb:version 属性の例を示します。

例38.2 JAXB カスタマイズバージョンの指定

< schema ...
        jaxb:version="2.0">

インラインカスタマイズの使用

コードジェネレーターが XML スキーマコンストラクトを Java コンストラクトにマップする方法をカスタマイズする最も直接的な方法は、カスタマイズ要素を XML スキーマ定義に直接追加することです。JAXB カスタマイズ要素は、変更される XML スキーマ構造の xsd:appinfo 要素内に配置されます。

例38.3「カスタマイズされた XML スキーマ」 は、インライン JAXB カスタマイズを含むスキーマの例を示しています。

例38.3 カスタマイズされた XML スキーマ

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.0">
  <complexType name="size">
    <annotation> <appinfo> <jaxb:class name="widgetSize" /> </appinfo> </annotation>
    <sequence>
      <element name="longSize" type="xsd:string" />
      <element name="numberSize" type="xsd:int" />
    </sequence>
  </complexType>
<schema>

外部バインディング宣言の使用

タイプを定義する XML スキーマドキュメントに変更を加えることができない、または変更したくない場合は、外部バインディング宣言を使用してカスタマイズを指定できます。外部バインディング宣言は、多数のネストされた jaxb:bindings 要素で設定されます。例38.4「JAXB 外部バインディング宣言構文」 は、外部バインディング宣言の構文を示しています。

例38.4 JAXB 外部バインディング宣言構文

<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="schemaUri" | wsdlLocation="wsdlUri">
    <jaxb:bindings node="nodeXPath">
      binding declaration
    </jaxb:bindings>
    ...
  </jaxb:bindings>
<jaxb:bindings>

schemaLocation 属性と wsdlLocation 属性は、変更が適用されるスキーマドキュメントを特定するために使用されます。スキーマドキュメントからコードを生成する場合は、schemaLocation 属性を使用します。WSDL ドキュメントからコードを生成する場合は、wsdlLocation 属性を使用します。

node 属性は、修正する特定の XML スキーマ構造を特定するために使用されます。これは、XML スキーマ要素に解決される XPath ステートメントです。

例38.5「XML スキーマファイル」 に示されているスキーマドキュメント widgetSchema.xsd の場合、例38.6「外部バインディング宣言」 に記載の外部バインディング宣言により、複合型 size の生成が変更されます。

例38.5 XML スキーマファイル

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        version="1.0">
  <complexType name="size">
    <sequence>
      <element name="longSize" type="xsd:string" />
      <element name="numberSize" type="xsd:int" />
    </sequence>
  </complexType>
<schema>

例38.6 外部バインディング宣言

<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="wsdlSchema.xsd">
    <jaxb:bindings node="xsd:complexType[@name='size']">
        <jaxb:class name="widgetSize" />
    </jaxb:bindings>
  </jaxb:bindings>
<jaxb:bindings>

コードジェネレーターに対して外部バインディング宣言を使用するように指示するには、以下のように wsdl2java ツールの -b binding-file オプションを使用します。

wsdl2java -b widgetBinding.xml widget.wsdl