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