Puspenduが参照しているように、バインディングのJAXBクライアントのカスタマイズは、必要なものに正確に/かなり近いものです。例では、JAX-WSクライアントのカスタマイズを使用する必要があります。JAXBおよびJAX-WSのカスタマイズにより、基本的に、制御していないWSDL/スキーマのスキーマ要素の定義を拡張できます。xml要素名をカスタムjava要素にマッピングする、生成されたAPIを変更する、質問に答える、列挙型で制限されている要素のタイプセーフな列挙型クラスを生成するなど、さまざまな方法で実行できます。
JAX-WSのクライアントカスタマイズを行うには2つの方法/部分があります。
1)WSDLが外部スキーマファイルをインポートする場合2)WSDLにインポートなしでスキーマ定義全体が含まれる場合
wsdlが外部スキーマファイルをインポートする場合、
基本的に、クライアントスタブ/ apiを生成するwsdlと一緒に維持する新しいファイル(通常はjxb拡張子が付いていますが、実際には問題ではありません)を作成する必要があります。通常、これらのファイルにはschema-file-name_clientcustomization.jxbという名前を付けます。
更新されたwsdlを取得するたびに、JXBファイルがそのwsdlに対して引き続き有効であることを検証する必要があります。特に列挙型の制限がある場合に私が探している最大のことは、制限された値の変更、名前空間の変更、型名の変更などです。
この新しいファイルの内容は、次のようになります。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jxb:bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
targetNamespace="http://java.sun.com/xml/ns/jaxb"
version="1.0">
<jxb:bindings schemaLocation="NameOfYourSchemaFile.xsd"
node="/xsd:schema[@targetNamespace='SCHEMANAMESPACE']">
<jxb:schemaBindings>
<jxb:package name="com.amazon.webservices.ecs" />
</jxb:schemaBindings>
<jxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType">
<jxb:typesafeEnumClass name="ConditionEnum" >
<jxb:typesafeEnumMember value="All" name="ALL" />
<jxb:typesafeEnumMember value="New" name="NEW" />
<jxb:typesafeEnumMember value="Used" name="USED" />
<jxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" />
<jxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" />
</jxb:typesafeEnumClass>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
基本的に、このファイルは、参照されるxsdファイルに対して実行する必要がある拡張を定義します。このファイルのすべてのバインディング要素には、拡張するスキーマ項目を選択するXPATH式であるノード属性があります。この例では、名前空間やその他の情報がないため、XPATHを指定して、要素の単純型宣言のみを選択しました。そのバインディング内で、typesafeenumclassを定義します。これにより、jaxb / wsimportは、参照される単純型を表す列挙型クラスを生成します。これは匿名の単純型であるため、参照される要素に対してのみクラスを効果的に定義します。生成されるクラスは、メンバーがtypesafeEnumMember要素の「name」属性によって定義されるENUMになります。
このJXBファイルを使用するには、次のようにantタスクで参照する必要があります。
<wsimport
debug="true"
keep="true"
verbose="true"
destdir="${generated.src}"
package="com.amazon.webservices.ecs"
wsdl="wsdl/AWSECommerceService.wsdl">
<binding dir="wsdl" includes="*.jxb"/>
</wsimport>
WSDLがスキーマ全体を内部で定義している場合は、JAX-WSカスタマイズファイルを使用する必要があります。このケースはあなたの質問に一致するものです。
http://jax-ws.java.net/nonav/2.1.7/docs/customizations.html
JAX-WSクライアントのカスタマイズは、JAXBのカスタマイズと非常によく似ています。考え方は同じです。ほとんどの場合、カスタマイズファイルのJAX-WS部分は、WSDLに特に関連する生成されたアーティファクトを変更しますが、埋め込まれたJAXBカスタマイズは、外部のカスタマイズファイルと同じ機能を実行します。スキーマ上。
大きな違いは、スキーマファイルがどこにあるかをJAXBパーサーに通知するのではなく、カスタマイズを適用するスキーマ定義を(XPATHを使用して)選択するバインディングセクションを提供することです。
この例では、質問している要素のEnumクラスを生成するために実際にテストおよび検証したので、このJAX-WSカスタマイズの例をそのままコピーできます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
wsdlLocation="AWSECommerceService.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
>
<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://webservices.amazon.com/AWSECommerceService/2010-11-01']">
<jaxb:schemaBindings>
<jaxb:package name="com.amazon.webservices.ecs"/>
</jaxb:schemaBindings>
<jaxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType">
<jaxb:typesafeEnumClass name="ConditionEnum" >
<jaxb:typesafeEnumMember value="All" name="ALL" />
<jaxb:typesafeEnumMember value="New" name="NEW" />
<jaxb:typesafeEnumMember value="Used" name="USED" />
<jaxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" />
<jaxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" />
</jaxb:typesafeEnumClass>
</jaxb:bindings>
</jaxws:bindings>
</jaxws:bindings>
次に、JXBファイルを参照するのと同じ方法で、このJAX-WSカスタマイズファイルを参照します。
スタンドアロンのJAXBカスタマイズの例は検証しませんでした。これは、実際には例として、およびJAX-WSカスタマイズの例の前身の説明としてのみ含めたためです。
リンクしたWSDLに対して実際にテスト/検証したJAX-WSカスタマイズの例なので、これを出発点として使用できるはずです。定義されたWSDLには列挙型の制限が多数あることに気付いたので、それらのほとんど/すべてに対して列挙型を生成する必要があると思います。
これがお役に立てば幸いです。