2012-01-12 21 views
5

sto usandoCome personalizzare package-info.java generato da JAXB2

<groupId>org.jvnet.jaxb2.maven2</groupId> 
<artifactId>maven-jaxb2-plugin</artifactId> 

per generare le classi Java da file XSD.

Ho aggiunto

<args>-npa</args> 

così, il plugin non genera più package-info.java, ma con questa opzione le classi Java generate sono diversi (namespace viene aggiunto a ogni elemento).

Quindi, non posso personalizzare lo spazio dei nomi utilizzando package-info.java.

Come è possibile utilizzare uno spazio dei nomi personalizzato senza modificare i file generati manualmente?

risposta

6

È possibile utilizzare il namespace prefisso plugin dal progetto jaxb2-comune (disclaimer: ho scritto):

https://github.com/Siggen/jaxb2-namespace-prefix

Questa è una pluging xjc che permette di definire namespace -> mappature prefisso all'interno del bindings.xml di file:

<jxb:bindings schemaLocation="eCH-0007-3-0.xsd"> 
    <jxb:schemaBindings> 
     <jxb:package name="ch.ech.ech0007.v3" /> 
    </jxb:schemaBindings> 
    <jxb:bindings> 
     <namespace:prefix name="eCH-0007" /> 
    </jxb:bindings> 
</jxb:bindings> 

Quale sarà Resul ts nel seguente file dipackage-info.java generati (mente il xmlns annotazione aggiunta):

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ech.ch/xmlns/eCH-0007/3", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { 
    @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.ech.ch/xmlns/eCH-0007/3", prefix = "eCH-0007-3") 
}) 
package ch.ech.ech0007.v3; 

tuo pom.xml sarà simile:

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <version>0.8.0</version> 
    <configuration> 
     <schemaDirectory>src/main/resources</schemaDirectory> 
     <catalog>src/main/resources/catalog.xml</catalog> 
     <schemaIncludes> 
      <include>*.xsd</include> 
     </schemaIncludes> 
     <bindingDirectory>src/main/resources</bindingDirectory> 
     <bindingIncludes> 
      <include>bindings.xml</include> 
     </bindingIncludes> 
     <args> 
      <arg>-extension</arg> 
      <arg>-Xnamespace-prefix</arg> 
     </args> 
    </configuration> 
    <executions> 
     <execution> 
      <goals> 
       <goal>generate</goal> 
      </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>org.jvnet.jaxb2_commons</groupId> 
      <artifactId>jaxb2-namespace-prefix</artifactId> 
      <version>1.0-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 
</plugin> 
+0

Cosa succede se voglio ignorare @ 'javax.xml.bind.annotation.XmlSchema (namespace = "http://www.ech.ch/xmlns/eCH-0007/3"' a '@javax .xml.bind.annotation.XmlSchema (namespace = "" '? Come può essere fatto? – icedek

+0

Perfetto, grazie! –

+0

@ icedek, se cambi lo spazio dei nomi xml, stai cambiando la definizione stessa del tuo XSD: anche se le strutture xml rimarrebbero identiche, non sarebbero compatibili. Se hai bisogno di farlo, perché non modificare lo stesso XSD? – Siggen

2

È possibile personalizzare namespace guidando JAX-B per generare il package-info.java e impostare lo spazio dei nomi di destinazione necessario nel tuo XSD.

<xs:schema version="1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd" 
    targetNamespace="yourTargetNameSpace" 
    xmlns="yourTargetNameSpace" 
    elementFormDefault="qualified"> 
+0

Questa è la risposta più semplice se si ha accesso a xsd. – Dave

Problemi correlati