ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLinkによるJAXBアプリケーションの開発
12c (12.1.2)
E48003-01
  目次へ移動
目次

前
 
次
 

4 単純な値のマッピング

この章の内容は次のとおりです。

4.1 単純な値のマッピング

この項では、単純なJava値をXMLテキスト・ノードに直接マップする方法をいくつか示します。

4.1.1 属性へのマッピング

例4-1のXMLスキーマであると仮定して、図4-1は、対応するXML文書内にある属性へのXMLダイレクト・マッピングを示します。

例4-1 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:attribute name="id" type="xsd:integer"/>
   </xsd:complexType>
 
</xsd:schema>

図4-1 属性へのXMLダイレクト・マッピング

属性へのXMLダイレクト・マッピング
「図4-1 属性へのXMLダイレクト・マッピング」の説明

例4-2は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。必要なのは、JAXBの標準的な@XmlAttribute注釈のみです。

例4-2 @XmlAttribute注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlAttribute
   private Integer id;
 
   ...
}
 

例4-3は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-3 マッピングの定義

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-attribute java-attribute="id"/>
   </java-attributes>
</java-type>
...
 

4.1.2 テキスト・ノードへのマッピング

この項では、次を実行した場合のXMLダイレクト・マッピングの使用方法について説明します。

4.1.2.1 単純な順序でのテキスト・ノードへのマッピング

例4-4のXMLスキーマであると仮定して、図4-2は、対応するXML文書内にある順序での個々のテキスト・ノードへのXMLダイレクト・マッピングを示します。

例4-4 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:sequence>
         <xsd:element name="first-name" type="xsd:string"/>
         <xsd:element name="last-name" type="xsd:string"/>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-2 個々のテキスト・ノードへのXMLダイレクト・マッピング

個々のテキスト・ノードへのXMLダイレクト・マッピング
「図4-2 個々のテキスト・ノードへのXMLダイレクト・マッピング」の説明

例4-1は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。ここでは、JAXBの標準的な@XmlElement注釈が、カスタマイズされた要素名とともに使用されます。

例4-5 @XmlElement注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlElement(name="first-name")
   private String firstName;
 
   @XmlElement(name="last-name")
   private String lastName;
 
   ...
}
 

例4-5では、マップされた属性に対してXML要素名を明示的に指定しました。これは省略可能な構成であり、名前を明示的に設定しなくても、XML要素はJava属性名を照合するのみで、XMLでは<firstName>Jane</firstName>のようになります。JAXBの名前バインディング・アルゴリズムの詳細は、『Java Architecture for XML Binding (JAXB) Specification』(http://jcp.org/en/jsr/detail?id=222)の「Appendix D: Binding XML Names to Java Identifiers」を参照してください。

例4-6は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。カスタム要素のnameを指定するには、name属性を使用します。

例4-6 name属性の使用

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-element java-attribute="firstName" name="first-name"/>
      <xml-element java-attribute="lastName" name="last-name"/>
   </java-attributes>
</java-type>
...

4.1.2.2 サブ要素でのテキスト・ノードへのマッピング

例4-7のXMLスキーマであると仮定して、図4-3は、対応するXML文書内のサブ要素にあるテキスト・ノードへのXMLダイレクト・マッピングを示します。

例4-7 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:sequence>
         <xsd:element name="personal-info">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="first-name" type="xsd:string"/>
                  <xsd:element name="last-name" type="xsd:string"/>
               <xsd:sequence>
            </xsd:complexType>
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-3 サブノードでのテキスト要素へのXMLダイレクト・マッピング

サブノードでのテキスト要素へのXMLダイレクト・マッピング
「図4-3 サブノードでのテキスト要素へのXMLダイレクト・マッピング」の説明

例4-8は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。ここでは、単純な要素名のカスタマイズではなく、新しいXML構造を実際に導入しているので、EclipseLinkの@XmlPath注釈が使用されています。

例4-8 @XmlPath注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlPath("personal-info/first-name/text()")
   private String firstName;
 
   @XmlPath("personal-info/last-name/text()")
   private String lastName;
 
   ...
}
 

例4-9は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。ここでは、カスタマイズされたXMLパスがxml-path属性に定義されます。

例4-9 xml-path属性の使用

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-element java-attribute="firstName" xml-path="personal-info/first-name/text()"/>
      <xml-element java-attribute="lastName" xml-path="personal-info/last-name/text()"/>
   </java-attributes>
</java-type>
...
 

4.1.2.3 位置によるテキスト・ノードへのマッピング

例4-10のXMLスキーマであると仮定して、図4-4は、対応するXML文書の位置によるテキスト・ノードへのXMLダイレクト・マッピングを示します。

例4-10 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:sequence>
         <xsd:element name="name" type="xsd:string" maxOccurs="2"/>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-4 テキスト・ノードへのXMLダイレクト・マッピング

テキスト・ノードへのXMLダイレクト・マッピング
「図4-4 テキスト・ノードへのXMLダイレクト・マッピング」の説明

例4-11は、Javaでのこのマッピングの構成方法を示しています。再び、より複雑なXMLパスのカスタマイズに向けて、EclipseLinkの@XmlPath注釈が使用されています。

例4-11 @XmlPath注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlPath("name[1]/text()")
   private String firstName;
 
   @XmlPath("name[2]/text()")
   private String lastName;
 
   ...
}

例4-12は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-12 マッピングの定義

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-element java-attribute="firstName" xml-path="name[1]/text()"/>
      <xml-element java-attribute="lastName" xml-path="name[2]/text()"/>
   </java-attributes>
</java-type>
...
 

4.1.2.4 単純なテキスト・ノードへのマッピング

例4-13のXMLスキーマであると仮定して、図4-5は、対応するXML文書内にある単純なテキスト・ノードへのXMLダイレクト・マッピングを示します。

例4-13 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="phone-number" type="xsd:string"/>
 
</xsd:schema>
 

図4-5 単純なテキスト・ノードへのXMLダイレクト・マッピング

単純なテキスト・ノードへのXMLダイレクト・マッピング
「図4-5 単純なテキスト・ノードへのXMLダイレクト・マッピング」の説明

例4-14は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。この場合は、@XmlValue注釈が使用されます。

例4-14 @XmlValue注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement(name="phone-number")
@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {
   @XmlValue
   private String number;
 
   ...
}
 

例4-15は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-15 マッピングの定義

...
<java-type name="PhoneNumber">
   <xml-root-element name="phone-number"/>
   <java-attributes>
      <xml-value java-attribute="number"/>
   </java-attributes>
</java-type>
...
 

4.1.3 指定のスキーマ・タイプへのマッピング

ほとんどの場合、EclipseLinkではXML文書のターゲット書式を決定できます。ただし、EclipseLinkで使用可能な複数のターゲットから、1つを指定する必要がある場合があります。たとえば、java.util.Calendarは、スキーマdatetimedateTimeのノードのいずれかにマーシャリングできる場合があり、byte[]は、スキーマhexBinaryまたはbase64Binaryノードにマーシャリングできる場合があります。

例4-16図4-6のXMLスキーマは、JavaのCalendarオブジェクトからXMLのdateフィールドへのXMLダイレクト・マッピングを示します。

例4-16 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:sequence>
         <xsd:element name="hire-date" type="xsd:date"/>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-6 特定のスキーマ・タイプへのXMLダイレクト・マッピング

特定のスキーマ・タイプへのXMLダイレクト・マッピング
「図4-6 特定のスキーマ・タイプへのXMLダイレクト・マッピング」の説明

例4-17は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。ここでは、マーシャリングされたXMLに出現するデータ型を指定するために、@XmlSchemaTypeが使用されています。

例4-17 @XmlSchemaType注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlElement(name="hire-date")
   @XmlSchemaType(name="date")
   private Calendar hireDate;
 
   ...
}
 

例4-18は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-18 マッピングの定義

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-element java-attribute="hireDate" name="hire-date">
         <xml-schema-type name="date"/>
      </xml-element>
   </java-attributes>
</java-type>
...
 

4.1.3.1 Javaタイプ・アダプタの使用

例4-19図4-7は、別々のバイナリ型の2つの異なるテキスト・ノードへのXMLダイレクト・マッピングを示しています。

例4-19 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:sequence>
         <xsd:element name="resume" type="xsd:base64Binary"/>
         <xsd:element name="picture" type="xsd:hexBinary"/>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-7 別々のバイナリ型の異なるテキスト・ノードへのXMLダイレクト・マッピング

図4-7の説明が続きます。
「図4-7 別々のバイナリ型の異なるテキスト・ノードへのXMLダイレクト・マッピング」の説明

例4-20は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。デフォルトでは、JAXBによってbyte[]base64Binaryにマーシャリングされるので、再開マッピングに必要となるものは特にありません。hexBinaryフィールドにマップするには、@XmlSchemaType注釈でXMLタイプを指定する一方、@XmlJavaTypeAdapterでは、値への変換を担当するアダプタ・クラス(この場合は組込みJAXB HexBinaryAdapter)を指定します。

例4-20 @XmlSchemaType注釈および@XmlJavaTypeAdapter注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   private byte[] resume;
 
   @XmlSchemaType(name="hexBinary")
   @XmlJavaTypeAdapter(HexBinaryAdapter.class)
   private byte[] picture;
 
   ...
}
 

例4-21は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-21 マッピングの定義

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-element java-attribute="resume"/>
      <xml-element java-attribute="picture">
         <xml-schema-type name="hexBinary"/>
         <xml-java-type-adapter value="javax.xml.bind.annotation.adapters.HexBinaryAdapter"/>
      </xml-element>
   </java-attributes>
</java-type>
...
 

4.1.4 シンプル・タイプ・トランスレータによるマッピング

ノードのタイプをXMLスキーマで定義していない場合は、XMLダイレクト・マッピングを構成してxsi:type属性を使用し、タイプ情報を提供できます。

例4-22のXMLスキーマであると仮定して、図4-8は、対応するXML文書にマップできるJavaクラスを示します。

例4-22 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="phone-number" type="phone-number-type"/>
 
   <xsd:complexType name="phone-number-type">
      <xsd:sequence>
         <xsd:element name="area-code" type="anySimpleType"/>
         <xsd:element name="number" type="anySimpleType"/>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-8 Javaクラスのサンプル

Javaクラスのサンプル
「図4-8 Javaクラスのサンプル」の説明

図4-9は、XML文書のシンプル・タイプ・トランスレータによるXMLダイレクト・マッピングを示します。このXML文書は前述のスキーマに準拠しています。

図4-9 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピング

シンプル・タイプ・トランスレータによるXMLダイレクト・マッピング
「図4-9 シンプル・タイプ・トランスレータによるXMLダイレクト・マッピング」の説明

例4-23は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。

例4-23 マッピングのサンプル

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement(name="phone-number")
public class PhoneNumber {
   @XmlElement(name="area-code")
   private Object areaCode;
 
   private Object number;
 
   ...
}
 

例4-24は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-24 XMLマッピングのサンプル

...
<java-type name="PhoneNumber">
   <xml-root-element name="phone-number"/>
   <java-attributes>
      <xml-element java-attribute="areaCode" name="area-code"/>
      <xml-element java-attribute="number"/>
   </java-attributes>
</java-type>
...

4.2 単純な値のコレクションのマッピング

この項では、単純なJava値のコレクションをXMLテキスト・ノードに直接マップする方法をいくつか示します。

4.2.1 テキスト・ノードへのマッピング

例4-25のXMLスキーマであると仮定して、図4-10では、対応するXML文書内にある要素へのJavaコレクションのマッピングを示します。

例4-25 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:sequence>
         <xsd:element name="email-address" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-10 テキスト・ノードへのXMLダイレクト・コレクション・マッピング

テキスト・ノードへのXMLダイレクト・コレクション・マッピング
「図4-10 テキスト・ノードへのXMLダイレクト・コレクション・マッピング」の説明

例4-26は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。必要なのは、JAXBの標準的な@XmlElement注釈のみです。

例4-26 @XmlElement注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlElement(name="email-address")
   private List<String> emailAddress;
 
   ...
}
 

例4-27は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-27 XMLマッピングのサンプル

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-element java-attribute="emailAddresses" name="email-address"/>
   </java-attributes>
</java-type>
...
 

4.2.2 グループ化要素によるテキスト・ノードへのマッピング

例4-28のXMLスキーマであると仮定して、図4-11では、対応するXML文書内にある要素へのJavaコレクションのマッピングを示します。ここでは、コレクションの要素を整理するためにグループ化要素を使用しています。

例4-28 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="customer" type="customer-type"/>
 
   <xsd:complexType name="customer-type">
      <xsd:sequence>
         <xsd:element name="email-address" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
   </xsd:complexType>
 
</xsd:schema>
 

図4-11 グループ化要素によるテキスト・ノードへのXMLダイレクト・コレクション・マッピング

図4-11の説明が続きます。
「図4-11 グループ化要素によるテキスト・ノードへのXMLダイレクト・コレクション・マッピング」の説明

例4-29は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。グループ化要素は、@XmlElementWrapper注釈を使用して指定します。

例4-29 @XmlElementWrapper注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlElement(name="email-address")
   @XmlElementWrapper(name="email-addresses")
   private List<String> emailAddresses;
 
   ...
}
 

例4-30は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-30 XMLマッピングのサンプル

...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-element java-attribute="emailAddresses" name="email-address">
         <xml-element-wrapper name="email-addresses"/>
      </xml-element>
   </java-attributes>
</java-type>
...
 

4.2.3 リスト要素へのマッピング

例4-31のXMLスキーマであると仮定して、図4-12では、対応するXML文書内にあるxsd:listタイプへのマッピングを示します。このマッピングを使用すると、単純なJavaオブジェクトのコレクションを、XML内で空白で区切られたトークンのStringとして表すことができます。ここで、タスク・リストには、DesignCodeTestの3つのエントリが含まれています。

例4-31 XMLスキーマのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
   <xsd:element name="employee" type="employee-type"/>
 
   <xsd:complexType name="employee-type">
      <xsd:sequence>
         <xsd:element name="tasks" type="tasks-type"/>
      </xsd:sequence>
   </xsd:complexType>
 
   <xsd:simpleType name="tasks-type">
      <xsd:list itemType="xsd:string"/>
   </xsd:simpleType>
 
</xsd:schema>
 

図4-12 listフィールドへのXMLダイレクト・マッピング

listフィールドへのXMLダイレクト・マッピング
「図4-12 listフィールドへのXMLダイレクト・マッピング」の説明

例4-32は、EclipseLinkでこのマッピングを取得するためにJavaクラスに注釈を付ける方法を示しています。

例4-32 @XmlList注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {
   @XmlList
   private List<String> tasks;
 
   ...
}
 

例4-33は、EclipseLinkのOXMメタデータ形式でマッピング情報を定義する方法を示しています。

例4-33 XMLマッピングのサンプル

...
<java-type name="Employee">
   <xml-root-element name="employee"/>
   <java-attributes>
      <xml-element java-attribute="tasks" xml-list="true"/>
   </java-attributes>
</java-type>
...
 

4.2.4 XmlAttributesまたはXmlValuesのコレクションのマッピング

例4-34に示すように、@XmlListは、@XmlAttributeまたは@XmlValueと組み合せて使用することもできます。このコレクションは、属性内のスペース区切りの文字列として表されます。

例4-34 Javaの注釈

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   @XmlAttribute
   @XmlList
   private List<Integer> ids;
 
   ...
}
 
package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement(name="phone-numbers")
@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumbers {
   @XmlValue
   @XmlList
   private List<String> numbers;
 
   ...
}
 

例4-35 EclipseLink OXMメタデータ

 
...
<java-type name="Customer">
   <xml-root-element name="customer"/>
   <java-attributes>
      <xml-attribute java-attribute="ids" xml-list="true"/>
   </java-attributes>
</java-type>
...
 
...
<java-type name="PhoneNumbers">
   <xml-root-element name="phone-numbers"/>
   <java-attributes>
      <xml-value java-attribute="numbers" xml-list="true"/>
   </java-attributes>
</java-type>
...
 

例4-36 XML文書の例

<customer ids="726 1982 1989 2991"/>
 
<phone-numbers>6132883982 6139828817 18882982298</phone-numbers>

4.3 単一のプロパティに対する複数のマッピング

標準的なJAXBでは、Javaフィールドごとに指定できるマッピングはせいぜい1つです。EclipseLink MOXy 2.3以降では、OXMメタデータを使用して1つのプロパティに複数のマッピングを作成できます。ただし、読取り可能なマッピングはせいぜい1つです(それ以外は「書込み専用」です)。

4.3.1

この例では、次のJavaクラスを使用します。

例4-37 Javaクラスのサンプル

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class CustomQuoteRequest {
 
   private int requestId;
 
   private String currencyPairCode;
 
}
 

例4-38は、EclipseLinkのOXMメタデータ形式でcurrencyPairCodeの複数のマッピングを定義する方法を示しています。2番目のマッピングではwrite-only="true"と指定されていることに注意してください。

例4-38 XMLスキーマのサンプル

...
<java-type name="CustomQuoteRequest">
   <xml-root-element/>
   <java-attributes>
      <xml-element java-attribute="requestId" name="id"/>
      <xml-attribute java-attribute="currencyPairCode" xml-path="req/info/instrmt/@sym"/>                           
      <xml-attribute java-attribute="currencyPairCode" xml-path="req/info/leg/token/@sym" write-only="true"/>           
   </java-attributes>
</java-type>
...
 

4.3.2 XML出力

例4-39に、CustomQuoteRequestがXMLにマーシャリングされる例を示します。

例4-39 結果となるXML

<?xml version="1.0" encoding="UTF-8"?>
<customQuoteRequest>
   <id>881</id>
   <req>
      <info>
         <instrmt sym="CAD/USD"/>
         <leg>
            <token sym="CAD/USD"/>
         </leg>
      </info>
   </req>
</customQuoteRequest>

4.4 列挙のマッピング

Java列挙は、@XmlEnum注釈と@XmlEnumValue注釈を使用してXMLにマップできます。

4.4.1 定数名を使用した列挙のマッピング

次のスキーマは、XML列挙を示しています。

例4-40 XMLスキーマのサンプル

<xs:simpleType name="CustomerType">
   <xs:restriction base="xs:string"/>
      <xs:enumeration value="PROMO_CUSTOMER"/>
      <xs:enumeration value="NEW_CUSTOMER"/>
      <xs:enumeration value="VIP"/>
      <xs:enumeration value="NORMAL"/>
   </xs:restriction>
</xs:simpleType>
 

enum定数名自体がXML表現に十分な場合は、@XmlEnum注釈を使用するだけです。

例4-41 @XmlEnum注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
   private CustomerType type = CustomerType.NEW_CUSTOMER;
 
   @XmlEnum(String.class)
   private enum CustomerType { PROMO_CUSTOMER, NEW_CUSTOMER, VIP, NORMAL }
 
   ...
}
 

例4-42は、EclipseLinkのOXMメタデータでこのマッピングを定義する方法を示しています。

例4-42 XMLマッピングのサンプル

...
<xml-enums>
   <xml-enum java-enum="CustomerType" value="java.lang.String">
      <xml-enum-value java-enum-value="PROMO_CUSTOMER">PROMO_CUSTOMER</xml-enum-value>
      <xml-enum-value java-enum-value="NEW_CUSTOMER">NEW_CUSTOMER</xml-enum-value>
      <xml-enum-value java-enum-value="VIP">VIP</xml-enum-value>
      <xml-enum-value java-enum-value="NORMAL">NORMAL</xml-enum-value>
   </xml-enum>
</xml-enums>
 
<java-types>
   <java-type name="Customer">
      <xml-root-element name="customer"/>
      <java-attributes>
         <xml-element java-attribute="type" type="CustomerType"/>
      </java-attributes>
   </java-type>
</java-types>
...
 

XMLにマーシャリングすると、Customerは次のようになります。

<customer>
   <type>NEW_CUSTOMER</type>
</customer>
 

4.4.2 カスタムXML値への列挙のマッピング

次のXMLスキーマ列挙が与えられたとします。

例4-43 XMLスキーマのサンプル

<xs:simpleType name="CustomerType">
   <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>
 

これをJavaでモデル化するには、enum定数ごとに、XML値を提供するために@XmlEnumValue注釈が使用されます。

例4-44 @XmlEnumValue注釈の使用

package example;
 
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
 
   private CustomerType type = CustomerType.NEW_CUSTOMER;
 
   @XmlEnum(Integer.class)
   private enum CustomerType { 
      @XmlEnumValue("1") PROMO_CUSTOMER, 
      @XmlEnumValue("2") NEW_CUSTOMER, 
      @XmlEnumValue("3") VIP,
      @XmlEnumValue("4") NORMAL;
 
      ...
}
 

例4-45は、EclipseLinkのOXMメタデータでこのマッピングを定義する方法を示しています。

例4-45 XMLマッピングのサンプル

...
<xml-enums>
   <xml-enum java-enum="CustomerType" value="java.lang.Integer">
      <xml-enum-value java-enum-value="PROMO_CUSTOMER">1</xml-enum-value>
      <xml-enum-value java-enum-value="NEW_CUSTOMER">2</xml-enum-value>
      <xml-enum-value java-enum-value="VIP">3</xml-enum-value>
      <xml-enum-value java-enum-value="NORMAL">4</xml-enum-value>
   </xml-enum>
</xml-enums>
 
<java-types>
   <java-type name="Customer">
      <xml-root-element name="customer"/>
      <java-attributes>
         <xml-element java-attribute="type" type="CustomerType"/>
      </java-attributes>
   </java-type>
</java-types>
...
 

XMLにマーシャリングすると、新しいCustomerは次のようになります。

<customer>
   <type>2</type>
</customer>