Trabajo relacionado con Java

11 de Marzo de 2009

Usar JAXB y maven2 para generar beans a partir de un DTD

Archivado en: Desarrollo — jansoblog @ 4:22 pm
Tags: , , , , , ,

He partido de esta documentación que está muy bien

 

https://jaxb.dev.java.net/jaxb-maven2-plugin/

 

El primer problema que he tenido ha sido descargar el jar del plugin a pesar de definir el repositorio

            <repository>

                  <id>java.net</id>

                  <name>java.net Maven Repository</name>

                  <url>https://maven-repository.dev.java.net/nonav/repository</url>

                  <layout>legacy</layout>

            </repository>

 

He encontrado el jar en

https://maven-repository.dev.java.net/repository/com.sun.tools.xjc.maven2/maven-plugins/

 

Lo he descargado y después lo he instalado en mi respoitorio

 

mvn install:install-file -DgroupId=com.sun.tools.xjc.maven2 -DartifactId=maven-jaxb-plugin -Dversion=1.1 -Dpackaging=maven-plugin -Dfile=maven-jaxb-plugin-1.1.jar

 

 

Una vez hecho esto he configurado un poco el plugin, ya que para trabajar con dtds hace falta algún pequeño cambio sobre la documentación inicial

<plugin>

      <groupId>com.sun.tools.xjc.maven2</groupId>

      <artifactId>maven-jaxb-plugin</artifactId>

            <version>1.1</version>

            <executions>

                  <execution>

                        <goals>

                             <goal>generate</goal>

                        </goals>

                  </execution>

            </executions>

      <configuration>

                             <generatePackage>es.test.ejemplo.xml</generatePackage>

      <includeSchemas>

                                                <includeSchema>**/ejemplo.dtd</includeSchema>

      </includeSchemas>

     

<excludeSchemas>

            <excludeSchema>**/*.xml</excludeSchema>

      </excludeSchemas>

 

      <includeBindings>

            <includeBinding>*.xjb</includeBinding>

      </includeBindings>

      <strict>true</strict>

      <verbose>true</verbose>

      <args>-dtd</args>

      </configuration>

</plugin>

 

Los cambios necesarios sobre la documentación original están marcados en negrita.

Sólo se puede hacer la generación de un DTD y hay que pasar un argumento –dtd al generador para que funcione correctamente.

Sólo recordar que el dtd ha de estar en el directorio src\main\resources 

Una vez hecho se han generado las clases correctamente en el directorio target\generated-sources\xjc

 

Para hacer que todo compile y se ejecute correctamente hay que añadir las siguientes dependencias :

 

            <dependency>

                  <groupId>javax.xml.bind</groupId>

                  <artifactId>jaxb-api</artifactId>

                  <version>2.0</version>

            </dependency>

 

            <dependency>

                  <groupId>com.sun.xml.bind</groupId>

                  <artifactId>jaxb-impl</artifactId>

                  <version>2.0.5</version>

            </dependency>

 

 

Y así hacer marshal y unmarshal se vuelve trivial

 

public String marshal(XMLRequest request) throws JAXBException, UnsupportedEncodingException {

            

       JAXBContext context = JAXBContext.newInstance(XMLRequest.class

                           .getPackage().getName());

       Marshaller m = context.createMarshaller();

 

       ByteArrayOutputStream bo = new ByteArrayOutputStream();

            

       m.marshal(request, bo) ;

       return bo.toString(“UTF-8″);

}

 

 

public Fact24Request unmarshal(String xml) throws JAXBException {

       JAXBContext context = JAXBContext.newInstance(XMLRequest.class

                           .getPackage().getName());

       Unmarshaller um = context.createUnmarshaller();

 

       Fact24Request request = (XMLRequest) um.unmarshal(new StringReader(xml));

       return request;

}

 

 

Blog de WordPress.com.