Java y XML con JAXB2 (IV)

12:02AM dic 12, 2007 en categoria Java por Enrique Rodriguez Lasterra

Etiquetas:


En el post de hoy seguiremos profundizando en las diferentes configuraciones que podemos aplicar sobre XJC para que nuestras clases Java sean tal y como queremos, para ello vamos a ver las configuraciones de Clase

Configuración de Clase

El tercer nivel de configuración es el de Clase y nos permite configurar la relación entre un elemento del Schema con un interfaz y/o clase Java. Es decir, podemos definir el nombre del interfaz que generara XJC en el paquete configurado y la clase que implementará dicho interfaz. Normalmente esta configuración se aplicará sobre los complexType de nuestros Schemas.Para ello la etiqueta <xjb:class> cuenta con tres atributos:

  • name, es el nombre de la clase Java que creará XJC en el paquete configurado.
  • implClass, es el nombre de la clase Java, con paquete, que debe heredar de la clase generada por JAXB, y que será creada por el ObjectFactory. Esto es interesante, bien porque ya existía una clase con cierta lógica de negocio, bien porque deseamos añadir lógica/código a la clase generada por XJC.
  • javadoc, es la documentación JavaDoc que XJC añadirá a la clase creada. Es conveniente introducir dicha documentación en un bloque CDATA para evitar problemas.

Ejemplo: Realizar cambios en la configuración para que la clase relacionada con el tipo complejo campo-uno se llame ElementoSecundario pero que el ObjectFactory nos cree objetos com.empresa.NivelDos, que previamente nos debemos encargar de programar heredando de ElementoSecundario.

<xs:complexType name="campo-uno">
<xs:annotation>
<xs:documentation>
Configuramos XJC para que la clase relacionada se
llama ElementoSecundario
</xs:documentation>
<xs:appinfo>
<jxb:class name="ElementoSecundario"
implClass="com.empresa.ElementoNivelDos"/>
</xs:appinfo>
</xs:annotation>

<xs:sequence>
<xs:element name="campo-uno-uno" type="xs:int"/>
<xs:element name="campo-uno-dos" type="xs:double" minOccurs="1"/>
</xs:sequence>
<xs:attribute name="attr" type="xs:string"/>
</xs:complexType

Al ejecutar la tarea de ANT vemos como se esperaba la clase ElementoSecundario

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "campo-uno", propOrder = {
"campoUnoUno",
"campoUnoDos"
})
public class ElementoSecundario {

@XmlElement(name = "campo-uno-uno")
protected int campoUnoUno;
@XmlElement(name = "campo-uno-dos")
protected double campoUnoDos;

Y como el ObjectFactory crea objetos com.empresa.ElementoNivelDos que nos debemos encargar que hereden de ElementoSecundario.

public ElementoSecundario createElementoSecundario() {
return new ElementoNivelDos();
}

La configuración externa nos permite ir viendo que cosas podemos hacer con XPath en el atributo node

<jxb:bindings version="2.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="schema.xsd"
node="/xs:schema">
<jxb:globalBindings
collectionType="java.util.LinkedList"
generateIsSetMethod="true"
/>
<jxb:schemaBindings>
<jxb:package name="org.lasterra.jaxb2"/>
</jxb:schemaBindings>
<jxb:bindings node="//xs:complexType[@name='campo-uno']">
<jxb:class name="ElementoSecundario"
implClass="com.empresa.ElementoNivelDos"/>
</jxb:bindings>

</jxb:bindings>
</jxb:bindings>
Como veís seguiremos bajando de nivel, en el próximo post veremos las configuraciones de propiedades/elementos.
Comentarios:

Enviar un comentario:
Los comentarios han sido deshabilitados.