2011-10-24 15 views
9

Esto me está volviendo loco. Tengo un esquema incrustado dentro de un WSDL que necesita personalización porque wsimport está lanzando el siguiente errorPersonalizaciones JAXB con un WSDL mal formado

[ERROR] Complex type and its child element share the same name "DomainsMap". 
Use a class customization to resolve this conflict. 
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl 

1) No tengo ningún control sobre este WSDL Estoy construyendo un primer cliente WSDL y espero que vaya más de las revisiones sin ninguna consulta formal o liberación para mí. 2) Ya no es aceptable reparar manualmente esta colisión de nombres porque necesito incluir la construcción de talones en una cadena de construcción automatizada.

Debo usar un archivo de personalización externo. Simplemente no puedo entender cómo hacer que la personalización funcione.

Aquí es el fragmento infractor WSDL:

<wsdl:definitions> 
    <wsdl:types> 
     <xs:schema> 
     . 
     . 
     . 
     <xs:complexType final="extension restriction" name="domainsMap"> 
     <xs:sequence> 
      <xs:element name="domainsMap"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element maxOccurs="unbounded" minOccurs="0" name="entry"> 
        <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="key" type="xs:string"/> 
         <xs:element minOccurs="0" name="value" type="tns:domainValueMap"/> 
        </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 

Esto sería una gran oportunidad para que usted pueda flexionar sus habilidades JAXB. Cualquier ayuda sería muy apreciada.

He estado mirando la documentación de jaxb durante horas y todavía no tuve suerte. Puedo ofrecer todo el WSDL si es necesario. ¿Alguien puede ayudar?

Respuesta

16

Bueno, esta mañana entré en el trabajo y fui capaz de resolver esto. A veces, alejarse del problema y regresar con la cabeza fresca es la mejor manera. Aquí está la solución que funcionó para mí:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxws:bindings 
    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" jaxb:version="2.1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    wsdlLocation="ArtesiaWebServices.wsdl"> 

    <enableWrapperStyle>true</enableWrapperStyle> 
    <enableAsyncMapping>false</enableAsyncMapping> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType"> 
     <!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainsMapElement"/> 
    </jaxws:bindings> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType"> 
     <!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainValueMapElement"/> 
    </jaxws:bindings> 
</jaxws:bindings> 

uso el archivo de enlace externo anterior con la herramienta wsimport en el siguiente comando.

cosas importantes acerca de este archivo de unión:

  • El espacio de nombres para JAXWS fijaciones se utiliza. Esta es la única forma en que podría hacer que la selección de nodos funcione correctamente
  • La selección de nodos debe finalizar con/xs: complexType. Si se detiene al seleccionar el nombre del elemento, el compilador generará errores.

    wsimport -D genera -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

opciones utilizadas:
-d genera especifica el directorio de salida (una carpeta llamada 'generado' en este caso)
-b ArtesiaExternalBinding.xml le dice al compilador JAXB que use el archivo de enlace.
-keep mantener los talones (i sólo tiene que utilizar los talonarios para la inspección)

por último, me pareció que este es el dato de información más útil: java.net documents on jaxws customizations

Esto es lo que me llevó a la anidación personalizaciones jaxb dentro de las etiquetas jaxws. Gracias por el enlace Petru Gardea

+1

¡Finalmente! ¡Gracias! Resolvió mis problemas .. – fachexot

+4

JABÓN .... Soo muchas horas de hombre perdido – dolbysurnd

+0

Lejos ... Esto simplemente no funciona sin las etiquetas mágicas 'jaxws' cuando se usa' wsimport' dentro del complemento maven. Gracias. – Strelok

3

No está claro lo que ha intentado o no, pero haría lo siguiente: - haga uso de la opción -b en la línea de comandos de wsimport (documento disponible here). - se puede encontrar información sobre archivos de enlace here; - Una vista en profundidad con ejemplos sobre cómo personalizar para evitar colisiones de nombres es here. Aquí proporciono un extracto: debería solucionar su problema.

<jxb:schemaBindings> 
     <jxb:package name="primer.myPo"> 
     <jxb:javadoc> 
    <![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]> 
     </jxb:javadoc> 
     </jxb:package> 
     <jxb:nameXmlTransform> 
      <jxb:elementName suffix="Element"/> 
     </jxb:nameXmlTransform> 
</jxb:schemaBindings> 
+1

Lo siento, pensé que seguiría a través de los enlaces que he adjuntado aquí; el enlace "información sobre archivos vinculantes" está anclado en esta declaración: "Estos enlaces JAXB pueden vivir dentro del esquema o como elemento secundario de un elemento jaxws: bindings". –

Cuestiones relacionadas