7 java ant wsdl web-services wsimport
我正在尝试为以下amazon 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>
Run Code Online (Sandbox Code Playgroud)
但是没有为以下元素生成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>
Run Code Online (Sandbox Code Playgroud)
即使生成了所有其他元素,基本上也不会生成枚举.以前有人见过这个问题吗?我正在使用jax-ws ri 2.2.1 http://jax-ws.java.net/2.2.1/
谢谢
正如Puspendu所引用的那样,JAXB客户端对绑定的定制完全/非常接近您所需要的 - 您需要为您的示例使用JAX-WS客户端定制.JAXB和JAX-WS自定义实质上允许您扩展您无法控制的WSDL /模式的模式元素的定义.您可以完成许多不同的事情,例如将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>
Run Code Online (Sandbox Code Playgroud)
本质上,此文件定义应对引用的xsd文件进行的扩充.此文件中的所有绑定元素都有一个节点属性,该属性是一个XPATH表达式,用于选择要扩充的架构项.在示例中,我没有任何命名空间或其他信息,所以我指定XPATH只选择元素的简单类型声明.在该绑定中,我们定义typesafeenumclass,这会导致jaxb/wsimport生成一个枚举类来表示引用的简单类型.因为它是一个匿名的简单类型,所以这有效地为引用的元素定义了一个类.生成的类将是一个ENUM,其中的成员由typesafeEnumMember元素的"name"属性定义.
要使用此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>
Run Code Online (Sandbox Code Playgroud)
如果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>
Run Code Online (Sandbox Code Playgroud)
然后,您将引用此JAX-WS自定义文件,就像引用JXB文件一样.
我没有验证独立的JAXB定制示例,因为我实际上只将它作为示例包含在内,并作为JAX-WS定制示例的前置解释.
JAX-WS自定义示例我实际上对您链接的WSDL进行了测试/验证,因此您应该能够将它作为起点.我注意到定义的WSDL中有许多枚举的限制,所以我假设你想要为大多数/所有它们生成枚举.
我希望这有帮助.
归档时间: |
|
查看次数: |
4159 次 |
最近记录: |