10

私は多くの検索を行ってきましたが、XML スキーマを既存のドメイン オブジェクトにマップする方法の簡潔な例を見つけることができませ。バインディング (xjb) ファイルを作成しましたが、これを行う方法が見つかりません。

次のような JAXB で使用する既存のドメイン オブジェクトがある場合:

package com.blah.domain;
class CustomerOffice{
   private int id;
   private String name;
   private String phone;
}

そして、次のような XML スキーマがあります。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:www="http://www.blah.com" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.blah.com" elementFormDefault="unqualified">
   <xs:element name="Customer">
      <xs:complexType>
         <xs:sequence>
           <xs:element name="id" type="xs:int" nillable="false" minOccurs="1" maxOccurs="1"/>
           <xs:element name="name" type="xs:string"/>
           <xs:element name="city" type="xs:string"/>
           <xs:element name="CustomerOffice" type="www:CustomerOffice" maxOccurs="unbounded"/>
        </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:complexType name="CustomerOffice">
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="length" type="xs:int"/>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

xjcを使用して JAXB クラスを生成すると、 Customerという名前の新しいクラスが作成されます(これが必要です)。また、 CustomerOfficeという名前の新しいクラスも作成します(これは望ましくありません。既存のドメイン オブジェクトを使用する必要があります)。

したがって、「type:www:CustomerOffice」を指すスキーマの代わりに、既存のcom.blah.domain.CustomerOfficeを使用する必要があります。

これをできるだけ単純な例にしようとしましたが、助けていただければ幸いです。

4

1 に答える 1

14

外部バインディング ファイルを使用して、必要なことを行うように XJC を構成できます。

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="yourSchema.xsd">
        <jxb:bindings node="//xs:complexType[@name='CustomerOffice']">
            <jxb:class ref="com.blah.domain.CustomerOffice"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

XJCコール

xjc -d outputDir -b binding.xml yourSchema.xsd
于 2012-05-02T19:55:37.920 に答える