簡體   English   中英

jax-ws ri 2.2.1對於Amazon ECS wsdl文件未生成任何枚舉

[英]No enums generated by jax-ws ri 2.2.1 for amazon ecs wsdl file

我正在嘗試為以下亞馬遜wsdl生成工件:
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-ws ri 2.2.1 http://jax-ws.java.net/2.2.1/
謝謝

正如Puspendu所引用的那樣,綁定的JAXB客戶端自定義恰好/非常接近您所需要的-您需要為示例使用JAX-WS客戶端自定義。 JAXB和JAX-WS定制本質上允許您為不受控制的WSDL / schema擴充模式元素的定義。 您可以完成許多不同的事情,例如將xml元素名稱映射到自定義java元素,更改生成的API,並回答您的問題,為受枚舉限制的元素生成類型安全的枚舉類。

為JAX-WS進行客戶端定制有兩種方法/部分。

1)如果WSDL導入了外部模式文件2)如果WSDL包含整個模式定義但沒有任何導入

如果wsdl導入了外部模式文件,

基本上,您需要創建一個新文件(通常以jxb擴展名,但這並不重要),您將與生成客戶端存根/ api的wsdl一起維護。 通常我將這些文件命名為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文件進行的擴充。 該文件中的所有綁定元素都具有node屬性,該屬性是XPATH表達式,用於選擇要擴充的架構項目。 在示例中,我沒有任何名稱空間或其他信息,因此我指定了XPATH以僅選擇元素的簡單類型聲明。 在該綁定中,我們定義了typesafeenumclass,這使jaxb / wsimport生成一個枚舉類來表示所引用的簡單類型。 由於它是一個匿名的簡單類型,因此可以有效地為引用的元素定義一個類。 生成的類將是一個ENUM,其成員由typesafeEnumMember元素的“名稱”屬性定義。

要使用此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定制執行與外部定制文件相同的功能:它根據以下內容更改生成的對象:在架構上。

最大的區別在於,您提供了一個綁定部分來選擇要應用定制的模式定義(使用XPATH),而不是告訴JAXB解析器模式文件在哪里。

我實際測試並驗證了這個示例,以為您要詢問問題的元素生成一個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中存在許多枚舉限制,因此我假設您將要為大多數/全部生成枚舉。

我希望這有幫助。

在JAXB-Binding中使用typesafeEnumMember

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

要么

像這樣[添加了名稱=“ 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM