2010-05-04 9 views
10

Ho un CommonTypes.xsd che sto includendo in tutti gli altri XSD usando xs: include. OttengoCompilare più schemi in diversi pacchetti usando JAXB 2.1

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

quando provo a compilarlo in diversi pacchetti utilizzando i file di associazione. Per favore dimmi se c'è un modo per compilarli in diversi pacchetti. Sto usando JAXB 2.1

+0

Si prega di aggiungere un file di collegamento esempio, alla propria domanda – skaffman

risposta

4

ho incontrare lo stesso problema e non l'ho risolverlo ancora, ma ho paura che non possa essere possibile generare XSD in differenti pacchetti:

non è legale per avere più di un < JAXB: schemaBindings> per spazio dei nomi, quindi è impossibile avere due schemi nello stesso namespace di destinazione compilato in diversi pacchetti Java

da Compiler Restrictions at the end of this page

ma se qualcuno trova qualche soluzione, informaci semplicemente per favore

6

Sì, c'è un modo.
Assumendo:

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

Nel luogo directory comune common.xjb:

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

Nella directory foo posto foo.xjb:

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

Nel file build.xml, creare un compito xjc per ogni :

<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> 

È necessario fare in modo che common.xsd ha un targetNameSpace che è diverso dal foo.xsd s' targetNameSpace.

+0

ick, non c'è modo di avere un file XJB? Abbiamo 20 xsds quindi odio avere 20 file xjb. –

+0

Sì, è possibile avere più in un singolo file .xjb. – tdrury

+0

@tdrury no, non è possibile quando '' si riferisce allo stesso 'targetnamespace'. – ulab

6

Come già affermato da Ben, non è possibile farlo se hanno lo stesso spazio dei nomi. Ma come si fa se si hanno diversi spazi dei nomi?

<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> 

ma essere sicuri di non utilizzare il parametro -p riga di comando, dal momento che si ignorare la configurazione.

3

So che è un vecchio post, ma, in quanto non v'è alcuna risposta per la domanda esatta, ecco la mia proposta:

Come mmoossen spiegato, il trucco è quello di specificare diversi spazi dei nomi per i XSD. Ma, l'aggiunta di un attributo namespace nel tag jxb:bindings non funziona:

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

Invece, è necessario aggiungere un attributo targetNamespace alle xs:schema tag dei XSD:

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

Una volta terminato, sarà possibile avere 1 file di personalizzazione esterno (.xjb) che dichiara diverso schemaBindings, ciascuno di essi eventualmente utilizzando un pacchetto diverso:

<?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

ha funzionato per me ... grazie! –

Problemi correlati