2011-03-01 11 views
29

Tengo dos esquemas que se procesan utilizando JAXB. El primer esquema es preprocesado y la información de esto se usa usando un archivo de episodio (siguiendo http://www.java.net/blog/2006/09/05/separate-compilation-jaxb-ri-21). El segundo esquema importa el primero, y nuevamente se utiliza jaxb. Todo esto funciona como se esperaba.JAXB esquemas múltiples con referencia de elemento

Pero ahora tengo un elemento en el primer esquema, que se usa en el segundo usando una referencia.

Esquema A:

<schema elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:test="http://www.example.org/Test/" 
targetNamespace="http://www.example.org/Test/"> 
<element name="type" type="test:MyType"></element> 

Esquema B:

<schema elementFormDefault="qualified" 
xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:second="http://www.example.org/Second/" 
xmlns:test="http://www.example.org/Test/" 
targetNamespace="http://www.example.org/Second/"> 

<import namespace="http://www.example.org/Test/" /> 

<complexType name="SomeType"> 
    <sequence> 
     <element ref="test:type" minOccurs="1" maxOccurs="unbounded" /> 
    </sequence> 
</complexType> 

Durante el procesamiento, nada está mal, pero el código generado para ambos esquemas proporcionan el mismo método:

public JAXBElement<EventType> createType(TypeType value) 

En tiempo de ejecución, el resultado es el siguiente error:

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

¿Cómo puedo prevenir JAXB desde la creación de los métodos createType duplicados?

¡Gracias de antemano!

Actualización: Hice esta misma pregunta en la lista de correo de JAXB, en esa lista también publiqué un ejemplo de trabajo. El hilo y el ejemplo se pueden encontrar en: http://java.net/projects/jaxb/lists/users/archive/2011-03/message/18

En esta lista se me ha sugerido una solución, y ahora puedo usar los esquemas de la manera que me gusta. Pero todavía creo que JAXB no debería crear el método adicional de "crear", ya que debería estar en el archivo del episodio.

+1

Lo son tus argumentos para xjc? – justkt

+0

Para el segundo esquema, uso XJC de hormiga, y el archivo de episodio está en un jar, que se proporciona como argumento. Y adicionalmente hay un catálogo para poder mapear al primer esquema. Esto parece funcionar, si no utilizo el jar con el archivo del episodio, el segundo esquema se usa para generar todos los tipos. Mientras que en mi ejemplo, solo el método createType (TypeType ..) está duplicado. – Alexander

+1

Por favor, presente un esquema completo. ¿Qué definición es "prueba: MyType"? –

Respuesta

1

He escrito algunas definiciones de esquema en mi época. Está declarando su primera xsd en su segunda declaración de esquema y luego la está importando.

Según MSDN, cuando importa un XSD no lo incluye en la Declaración de esquema. Aquí está donde está en su declaración de esquema.

xmlns: test = "" http://www.example.org/Test/

suprimir este y sólo hacer la importación ... (<xs:import namespace="http://www.example.com/IPO" />)

véase: http://msdn.microsoft.com/en-us/library/ms256480.aspx

+0

Lo intenté en Linux/Java-land y en la utilidad de línea de comandos xmllint y JAXB xjc compilador La tarea Ant se quejó con el mismo mensaje más o menos. Tanto la declaración de importación como la de prefijo parecen ser necesarias. Es un poco espeluznante que MSDN se comporte de manera diferente. –

Cuestiones relacionadas