没有为jax-ws ri 2.2.1为amazon ecs wsdl文件生成的枚举

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/
谢谢

Hel*_*ter 5

正如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中有许多枚举的限制,所以我假设你想要为大多数/所有它们生成枚举.

我希望这有帮助.