2010-10-20 13 views
7

esta es mi primera pregunta, por favor sea amable;)¿Solución JAXB para importar Cameleon XSD?

Tengo un problema extraño. Esencialmente me sale tres definiciones XSD como el siguiente:

PartA.xsd 
targetNameSpace="PartA" 
include="PartB.xsd" 

PartB.xsd 
<!-- no namespace definition!!! --> 

PartC.xsd 
targetNameSpace="PartC" 
inlude="PartB.xsd" 
import="PartA.xsd" 

El error aparece, al enlazar Parte C a través de JAXB a las clases de Java:

  • Una clase/interfaz con el mismo nombre "b. exampleType "ya está en uso. Use una personalización de clase para resolver este conflicto.
  • Este error confuso se debe a que el esquema utiliza una técnica llamada "esquema de camaleón", que hace que una única definición se cargue varias veces en diferentes espacios de nombres. Consulte http://forums.java.net/jive/thread.jspa?threadID=18631 para obtener más información al respecto.

Siguiendo el enlace, me enteré, el error real se encuentra en PartB, que no tiene declaración de espacio de nombres! Este método se llama Chameleon Schema. Los tipos definidos en PartB adoptarán el espacio de nombres del importando XSD.

Así que en mi caso, hay dos espacios de nombres para el mismo tipo:

  1. "Parte A"
  2. "Parte C"

Y esto es, en el JAXB se rompe. No he encontrado una forma de vincular correctamente PartC. Y (para complicar las cosas) ¡tengo la oportunidad de cambiar las definiciones XSD originales!

¿Alguien ha encontrado este fenómeno o algo así antes y tiene una solución válida para ello?

Respuesta

1

El siguiente está disponible, aunque no proporciona una gran cantidad de detalles:

+0

Gracias por el enlace, pero tiene razón, no es realmente detallado. Y como no tengo acceso de escritura en el esquema, estoy atascado. ... Aunque, tal vez puedo discutir con el autor del esquema sobre "En algunos otros casos, el esquema de camaleón puede argumentarse como un mal diseño de esquema, ya que duplica las definiciones en muchos lugares". punto. – Gruber

0

que estaba teniendo el mismo problema y la búsqueda de google me aterrizó aquí. Su pregunta es lo suficientemente detallada y pude encontrar la respuesta, lo que hice fue poner el espacio de nombres en PartB.xsd y usar XJC para generar las clases de Java. he añadido lo siguiente:

xmlns:ns="http://www.myCompany.com/2009/01/CustSchema" targetNamespace="http://www.myCompany.com/2009/01/CustSchema"

3

que estaba enfrentando el mismo problema usando wsdl2java:

WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "Respuesta" is already in use. Use a class customization to resolve this conflict.

Pero esto question me señaló en la dirección correcta. Al usar wsdl2java de CFX, puede personalizar cómo se vinculan los elementos a las clases utilizando un archivo binding.xml. Por ejemplo:

/Applications/apache-cxf-2.7.13/bin/wsdl2java -b ./src/main/resources/binding.xml -V -d src/main/java -compile -classdir target/classes http://someurl.wsdl 

La clave es explicar en el binding.xml nombrar cierto elemento xsd con una className especific para evitar colissions:

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> 

    <jxb:bindings schemaLocation="./someXsdFile.xsd"> 
    <!-- Rename the respuesta class to resolve a naming conflict with other Respuesta element already defined--> 
    <jxb:bindings node="//xs:element[@name='respuesta']/xs:complexType"> 
     <jxb:class name="Respuesta2" /> 
    </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

Espero que esto ayude a la siguiente persona con este problema al usar wsdl2java. Supongo que otras herramientas deberían permitir enfoques similares a este problema.

Cuestiones relacionadas