2010-05-04 18 views
10

Tengo un CommonTypes.xsd que incluyo en todos mis otros XSD usando xs: include. ObtengoCompilación de esquemas múltiples en diferentes paquetes usando JAXB 2.1

Multiple <schemaBindings> are defined for the target namespace "" 

cuando intento compilarlo en diferentes paquetes utilizando archivos de enlace. Por favor dígame si hay una manera de compilarlos en diferentes paquetes. Estoy usando jaxb 2.1

+0

añada un archivo de enlaces de ejemplo a su pregunta – skaffman

Respuesta

4

Tengo cumplir con el mismo problema y no he resolver todavía, pero me temo que no puede ser posible generar XSD en paquetes diferentes:

no es legal tener más de un < jaxb: schemabindings> por espacio de nombres, por lo que es imposible tener dos esquemas en el mismo espacio de nombres compilado en diferentes paquetes Java

de Compiler Restrictions at the end of this page

pero si alguien encuentra un poco de trabajo, simplemente infórmenos por favor

6

Sí, hay una manera.
Suponiendo:

xsd/common/common.xsd 
xsd/foo/foo.xsd 

En el lugar común de directorio common.xjb:

<jxb:schemaBindings> 
    <jxb:package name="mypkg.common"> 
    </jxb:package> 
</jxb:schemaBindings> 

En el foo lugar directorio foo.xjb:

<jxb:schemaBindings> 
    <jxb:package name="mypkg.foo"> 
    </jxb:package> 
</jxb:schemaBindings> 

En el archivo build.xml, crear una tarea xjc para cada :

<xjc destdir="${app.src}" readOnly="true" package="mypkg.common"> 
    <schema dir="${app.schema}/common" includes="*.xsd" /> 
    <binding dir="${app.schema}/common" includes="*.xjb" /> 
</xjc> 
<xjc destdir="${app.src}" readOnly="true" package="mypkg.foo"> 
    <schema dir="${app.schema}/foo" includes="*.xsd" /> 
    <binding dir="${app.schema}/foo" includes="foo.xjb" /> 
</xjc> 

Usted necesita asegurarse de que tiene una common.xsdtargetNameSpace que es diferente de foo.xsd 's targetNameSpace.

+0

ick, no hay manera de tener un archivo xjb? Tenemos 20 xsds, así que odio tener 20 archivos xjb. –

+0

Sí, puede tener múltiples en un solo archivo .xjb. – tdrury

+0

@tdrury no, no es posible cuando '' se refiere al mismo 'targetnamespace'. – ulab

6

Según lo indicado por Ben, no hay forma de hacerlo si tienen el mismo espacio de nombres. ¿Pero cómo hacerlo si tiene diferentes espacios de nombres?

<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
    <jxb:bindings namespace="http://www.openapplications.org/oagis/9/unqualifieddatatypes/1.1" schemaLocation="oagi/Common/UNCEFACT/ATG/CoreComponents/UnqualifiedDataTypes.xsd" > 
     <jxb:schemaBindings> 
      <jxb:package name="com.test.oagi.udt"/> 
     </jxb:schemaBindings> 
    </jxb:bindings> 
    <jxb:bindings namespace="http://www.openapplications.org/oagis/9/codelists" schemaLocation="oagi/Common/OAGi/Components/CodeLists.xsd" > 
     <jxb:schemaBindings> 
      <jxb:package name="com.test.oagi.cl"/> 
     </jxb:schemaBindings> 
    </jxb:bindings> 
</jxb:bindings> 

pero asegúrese de no utilizar el parámetro de línea de comando -p, ya que eso anulará su configuración.

3

Sé que es una entrada antigua, pero, como no hay respuesta para la pregunta exacta, aquí está mi propuesta:

Como mmoossen explicó, el truco es especificar diferentes espacios de nombres para los XSDs. embargo, la adición de un atributo namespace en la etiqueta jxb:bindings no funciona:

<jxb:bindings namespace="http://www.openapplications.org/oagis/9/unqualifieddatatypes/1.1" schemaLocation="oagi/Common/UNCEFACT/ATG/CoreComponents/UnqualifiedDataTypes.xsd" > 

En lugar de eso, es necesario agregar un atributo a los targetNamespacexs:schema etiquetas de sus XSDs:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" attributeFormDefault="unqualified" 
    targetNamespace="some.namespace" 
    version="1.0"> 

Una vez hecho esto, podrá tener 1 archivo de personalización externo (.xjb) declarando diferente schemaBindings, cada uno de ellos posiblemente usando un paquete diferente:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.1" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" 
       jaxb:extensionBindingPrefixes="xjc annox inherit"> 


    <jaxb:bindings schemaLocation="MyFirstXSD.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="com.test.a" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

    <jaxb:bindings schemaLocation="MySecondXSD.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="com.test.b" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

    <jaxb:bindings schemaLocation="MyThirdXSD.xsd"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="com.test.c" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 

</jaxb:bindings> 
+0

funcionó para mí ... ¡gracias! –

Cuestiones relacionadas