2012-01-12 8 views
5

estoy usandoCómo personalizar package-info.java generada por JAXB2

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

para generar clases Java desde archivos XSD.

He añadido

<args>-npa</args> 

así, el plugin no genera más package-info.java, pero con esta opción las clases Java generadas son diferentes (se añade espacio de nombres para cada elemento).

Por lo tanto, no puedo personalizar el espacio de nombres utilizando package-info.java.

¿Cómo puedo usar un espacio de nombres personalizado sin modificar los archivos generados manualmente?

Respuesta

6

Usted puede utilizar el espacio de nombres en el prefijo plugin desde jaxb2 común proyecto (disclaimer: Me lo escribió):

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

Este es un pluging xjc que permite definir espacio de nombres -> asignaciones de prefijo dentro de la bindings.xml archivo:

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

Qué le Resul TS en el siguiente archivo de package-info.java siendo generados (importa el xmlns añadido anotación):

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

Su pom.xml se vería así:

<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

¿Qué pasa si quiero anular '@ javax.xml.bind.annotation.XmlSchema (namespace = "http://www.ech.ch/xmlns/eCH-0007/3"' a '@javax .xml.bind.annotation.XmlSchema (namespace = "" '? ¿Cómo se puede hacer? – icedek

+0

Perfecto, ¡gracias! –

+0

@icedek, si cambia el espacio de nombres xml, está cambiando la definición misma de su XSD: aunque Las estructuras xml seguirían siendo idénticas, no serían compatibles. Si necesita hacerlo, ¿por qué no modificar el XSD? – Siggen

2

Puede personalizar espacio de nombres guiando JAX-B para generar el package-info.java y estableciendo el espacio de nombres de destino necesario en su 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

Esta es la respuesta más fácil si tiene acceso a la xsd. – Dave

Cuestiones relacionadas