2012-10-01 42 views
8

Tenemos una clase con una anotación JAXB en una propiedad. Luego tenemos varias subclases que anotan el resto de los datos importantes. Sin embargo, tenemos una subclase en la que queremos ignorar la anotación de la clase padre para que no se organice. Aquí hay un código de ejemplo.¿Cómo ignorar las propiedades anotadas de JAXB en una clase principal?

clase de Padres:

@XmlType(name="Request") 
@XmlAccessorType(XmlAccessorType.NONE) 
public abstract class Request { 
    @XmlElement(required=true) 
    private UUID uuid; 

    ... setter/getter 
} 

Ahora para la subclase:

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data1; 

    ... setters/getters ... 
} 

Cuando masrhall una instancia de ConcreteClass me sale el siguiente XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <uuid>uuid</uuid> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

donde quiero XML como este:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

Tenemos otras implementaciones de Solicitud, sin embargo, que requieren el UUID, este es solo un caso especial. ¿Hay alguna forma de ignorar el campo UUID en mi ConcreteRequest?

Respuesta

6

Espero, entendí su problema. Aquí está la solución.

JAXB proporciona @XmlTransient(javax.xml.bind.annotation.XmlTransient)(javadoc) para ignorar cualquier campo durante la clasificación.

Override el campo "uuid" como @XmlTransient en su clase derivada (ConcreteRequest.class) junto con su método de captador/definidor correspoding. Es necesario anular los métodos Getter/Setter también, estos serán invocados durante la clasificación.

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data2; 
    @XmlTransient 
    private UUID uuid; 

    ... setters/getters ... 
} 

Esto anulará su atributo de clase base.

Vuelva a consultarme para obtener más información.

+0

Lamentablemente, no creo que eso sea posible en mi situación. El campo UUID se conserva en nuestra base de datos por lo que anularlo sería peligroso. Básicamente, mi clase es una subclase especial en la que tiene un UUID pero no pertenece al esquema XML. – prozaak

+0

De mi análisis, JAXB no proporciona una opción adecuada para su requerimiento, lo que sugeriría es utilizar el comportamiento de JAXB - "El elemento de valores nulos será ignorado cuando @XmlElement (nillable = false)". De modo que, en el momento de Marshalling, haga que el valor "uuid" explicite sea nulo, para que no construya la propiedad durante Marshalling. Tengo un ejemplo de código pero no pude compartirlo aquí. – omega

+0

Esto simplemente no funciona. – GoalBased

0

Puede utilizar

@XmlAccessorType(XmlAccessType.NONE) 

en la clase padre, y

@XmlAccessorType(XmlAccessType.FIELD) 

en la clase derivada.

Cuestiones relacionadas