Menu Close

第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 カスタマイズ namespace」に示されているものと同様の namespace 宣言を追加する必要があります。これは、JAXB カスタマイズを定義するすべての XML ドキュメントのルート要素に追加されます。

例38.1 JAXB カスタマイズ namespace

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">

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

コードジェネレーターが Java 構造に XML スキーマ構造をどのようにマッピングするかをカスタマイズする最も直接的な方法は、カスタマイズ要素を直接 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