2010-11-25 16 views
5

Tengo la siguiente situación:JAXB xsd: incluir y separar paquetes

Hay 2 archivos xsd. El primero define un elemento raíz y varios tipos.

El segundo incluye el primero y amplía uno de los tipos. No no es un tipo de raíz definido en este archivo.

Desde la primera xsd, se genera un modelo en un paquete (a). El segundo esquema debe crear un nuevo paquete (b) para los tipos adicionales , pero reutilizar el paquete generado a. Lo resolví utilizando un archivo de enlace que apunta a los elementos generados previamente (en el paquete a). Hasta ahora esto funciona, pero ...

JAXB genera un ObjectFactory en el paquete A, que contiene un método create para el elemento raíz. Para el segundo esquema, también se crea un ObjectFactory en el paquete B. Y esta clase también tenía el método create para el mismo elemento raíz.

Para poder utilizar todos los tipos, el contexto jaxb se crea utilizando fábricas de objetos múltiples (newInstance(a.ObjectFactory.class, b.ObjectFactory.class)).

En tiempo de ejecución esto se traduce en el siguiente error:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions The element name {http://www.example.org/Scenario/}scenario has more than one mapping

¿Debo generar los paquetes de manera diferente? ¿O hay algo posible utilizando el archivo de enlace para evitar que la fábrica de objetos tenga métodos duplicados?

Respuesta

6

En primer lugar, es importante comprender que si utiliza xsd:include en lugar de xsd:import, no tiene dos esquemas diferentes. Se trata de un esquema en varios archivos y compilarlo en varios paquetes y engañar a JAXB para que combine estos paquetes se parece más a la piratería.

Así que mi sugerencia principal sería utilizar xsd:import en su lugar y considerar el enfoque separate schema compilation.

Si quiere quedarse con xsd:include, tendrá que engañar a JAXB. Por ejemplo, puede eliminar o modificar una (o ambas) de las clases ObjectFactory y crear su contexto JAXB basándose en clases individuales en lugar de fábricas de objetos. También puede usar jaxb.index en lugar de fábricas de objetos. Pero todo es piratería.

+0

Gracias por la respuesta. Ya lo cambié para usar la importación en lugar de incluir, de hecho parece ser mejor. Voy a echar un vistazo a la publicación del blog, parece prometedor hasta el momento. – Alexander

+0

Esto resolvió mi problema. Gracias por el enlace, he estado buscando por días. : S – Alexander

+1

usando importar en lugar de include puede haber funcionado para este caso en particular, pero el mismo problema con ObjectFactory que contiene métodos duplicados puede aparecer al usar también importación (si se usan referencias a objetos). Ver: http://stackoverflow.com/questions/5155414/jaxb-multiple-schemas-with-element-reference –

Cuestiones relacionadas