2010-11-20 9 views
7

Estoy intentando generar artefactos para el siguiente WSDL Amazon:
http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdlNo hay enumeraciones generada por JAX-WS RI 2.2.1 para ecs amazon archivo WSDL

utilizando la siguiente tarea 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> 

pero no hay artefactos Java se generan para el siguiente elemento que se parecen a esto:

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

Básicamente no hay enumeraciones se generan a pesar de que una ll otros elementos son generados. Alguien ha visto este problema antes? Estoy usando JAX-WS RI 2.2.1 http://jax-ws.java.net/2.2.1/
Gracias

Respuesta

5

según lo mencionado por Puspendu, la personalización del enlace JAXB del cliente es exactamente/bastante cercana a lo que necesita; necesita utilizar una personalización de cliente JAX-WS para su ejemplo. Las personalizaciones de JAXB y JAX-WS esencialmente le permiten aumentar la definición de elementos de esquema para WSDL/schema que no controla. hay MUCHAS cosas diferentes que puede realizar, como asignar nombres de elementos xml a elementos personalizados de Java, alterar la API generada y responder a su pregunta, generando clases enum de tipo seguro para elementos que están restringidos con una enumeración.

Hay dos maneras/partes de hacer una personalización de cliente para JAX-WS.

1) si el WSDL importa un archivo de esquema externo 2) si el WSDL contiene toda la definición del esquema sin ninguna importación

si el WSDL importa un archivo de esquema externo a continuación,

Básicamente necesitas cree un nuevo archivo (generalmente con una extensión jxb, pero realmente no importa) que mantendrá junto con el wsdl para el que está generando el stub/api del cliente. Me suelen nombrar estos archivos esquema-file-name_clientcustomization.jxb

cada vez que reciba un WSDL actualizado, debe validar que el archivo de JXB sigue siendo válida para ese WSDL. Las cosas más grandes que he encontrado para buscar, sobre todo con las restricciones de enumeración, se restringen los cambios de valor, los cambios de espacio de nombres, nombre cambia el tipo, etc ..

el contenido de este archivo nuevo se verá algo similar a esto:

<?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> 

Esencialmente, este archivo define el aumento que se debe hacer al archivo xsd al que se hace referencia. todos los elementos de enlaces en este archivo tienen un atributo de nodo que es una expresión XPATH que selecciona el elemento de esquema que desea aumentar. en el ejemplo, no tengo ningún espacio de nombres u otra información, así que especifiqué el XPATH para seleccionar solo la declaración de tipo simple del elemento.dentro de ese enlace, definimos el typesafeenumclass, esto hace que jaxb/wsimport genere una clase enum para representar el tipo simple referenciado. ya que es un tipo simple anónimo, esto efectivamente define una clase solo para el elemento al que se hace referencia. La clase generada será un ENUM cuyos miembros están definidos por el atributo "nombre" del elemento typesafeEnumMember.

utilizar este archivo JXB, es necesario hacer referencia a ella en su tarea de hormigas, así:

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

si el WSDL define el esquema completo internamente, entonces es necesario utilizar un archivo de personalización JAX-WS . Este caso es lo que coincide con tu pregunta.

http://jax-ws.java.net/nonav/2.1.7/docs/customizations.html

personalización del cliente JAX-WS es muy similar a la personalización JAXB. La idea es idéntica, en su mayor parte, la porción JAX-WS del archivo de personalización alterará artefactos generados que están específicamente relacionados con WSDL, mientras que la personalización incorporada de JAXB realiza la misma función que un archivo de personalización externo: altera los objetos generados basados en el esquema

La gran diferencia es que en lugar de indicarle al analizador JAXB dónde está el archivo de esquema, proporcione una sección de enlace que seleccione la definición del esquema (utilizando XPATH) que desea aplicar la personalización.

Este ejemplo probé y verifiqué que generaba una clase Enum para el elemento sobre el que hacía preguntas, por lo que puede copiar este ejemplo de personalización de JAX-WS al pie de la letra.

<?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> 

usted entonces hacer referencia a este archivo de personalización JAX-WS la misma forma que lo haría referencia al archivo JXB.

No validé el ejemplo de personalización JAXB independiente, ya que realmente solo lo incluí como ejemplo y como explicación precursora para el ejemplo de personalización de JAX-WS.

El ejemplo de personalización de JAX-WS que realmente probé/validé contra el WSDL que ha vinculado, por lo que debería poder utilizarlo como punto de partida. Noté que hay numerosas restricciones enumeradas en el WSDL definido, así que supongo que querrá generar enumeraciones para la mayoría de ellos o para todos ellos.

Espero que esto ayude.

1

Uso typesafeEnumMember en JAXB-Binding

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

O

Algo como esto [añadido name =" 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> 
+0

Hola, gracias por tu respuesta. ¿Podrías profundizar en eso? No controlo el archivo wsdl que proviene de Amazon. –

+0

@leftbrainlogic si el camino descrito por Helter parece difícil de seguir, simplemente agregue un atributo 'nombre' al nodo simpleTipo corrensponding xs: enumeración –

+1

si no posee el WSDL, luego edítelo para satisfacer sus necesidades no es un opción muy escalable. Tendría que volver a hacer la edición, cada vez que obtenga una nueva versión del wsdl. este es exactamente el caso para el que se diseñó la personalización del lado del cliente. Si no tiene problemas para editar y reeditar el wsdl, puede refactorizar el tipo interno anónimo del elemento Condición en un tipo simple con nombre adecuado, y generará una clase enum, sin embargo, eso no es práctico para hacer cada vez. obtienes un nuevo WSDL, especialmente con la cantidad de enumeraciones definidas en amazon wsdl. –

Cuestiones relacionadas