![](/img/trans.png)
[英]JAX-WS No Enum generated parsing WSDL with list of restrictions (enums)
[英]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.