7

次のAmazonwsdlのアーティファクトを生成しようとしています:
http ://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl

次のantタスクを使用します。

<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
    <classpath>
        <pathelement location="${BUILD_LIBS}/jaxws-ri/lib/jaxws-tools.jar"/>
    </classpath>
</taskdef>

<target name="wsimport" depends="init">
    <delete dir="${generated.src}" />
    <mkdir dir="${generated.src}"/>
    <wsimport
        debug="true"
    keep="true"
    verbose="true"
    destdir="${generated.src}"
    package="com.amazon.webservices.ecs"
    wsdl="wsdl/AWSECommerceService.wsdl"/>
</target>

ただし、次のような要素のJavaアーティファクトは生成されません。

<xs:element name="Condition">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="All"/>
            <xs:enumeration value="New"/>
            <xs:enumeration value="Used"/>
            <xs:enumeration value="Collectible"/>
            <xs:enumeration value="Refurbished"/>
       </xs:restriction>
   </xs:simpleType>
</xs:element>

基本的に、他のすべての要素が生成されても、列挙型は生成されません。誰かが以前にこの問題を見たことがありますか?jax-wsri2.2.1を使用していますhttp://jax-ws.java.net/2.2.1/
ありがとう

4

2 に答える 2

5

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には列挙型の制限が多数あることに気付いたので、それらのほとんど/すべてに対して列挙型を生成する必要があると思います。

これがお役に立てば幸いです。

于 2010-12-03T17:34:21.053 に答える
1

typesafeEnumMemberJAXBバインディングでの使用

参照:http ://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html#wp148439

または

このようなもの[addedname = "ConditionType" ]:

<xs:simpleType name="ConditionType">
            <xs:restriction base="xs:string">
                <xs:enumeration value="All"/>
                <xs:enumeration value="New"/>
                <xs:enumeration value="Used"/>
                <xs:enumeration value="Collectible"/>
                <xs:enumeration value="Refurbished"/>
            </xs:restriction>
        </xs:simpleType>
于 2010-11-30T20:02:07.623 に答える