2012-06-10 13 views
29

que tienen 2 clases:campos Excluyendo en JAXB

@XmlRootElement 
public class A { 

    private Long id; 
    private B b; 

    // setters and getters 
} 

y

@XmlRootElement 
public class B { 

    private Long id; 
    private String field1; 
    private String field2; 

    // setters and getters 
} 

Por defecto, si transformo una instancia de la clase A al XML, voy a tener todos sus campos (id) y los campos referenciados B clase (id, field1, field2) como este:

<a> 
    <id>2</id> 
    <b> 
     <id>5</id> 
     <field1>test1</field1> 
     <field2>test3</field2> 
    </b> 
</a> 

¿Es posible modificar qué campos de la clase de referencia B se incluyen en el XML de la clase A? P.ej. Quiero decir que cuando me transformo una instancia de la clase A, sólo quiero conseguir id de la clase B (no field1 y field2 campos), por lo que quiero llegar:

<a> 
    <id>2</id> 
    <b> 
     <id>5</id> 
    </b> 
</a> 

no quiero para anotar de forma permanente la clase B (usando @XMLTransient o @XMLElement) para lograrlo, ya que hay casos en los que me quiere exportar toda clase B como es (con id, field1 y field2.)
que simplemente no quieren exportar todos estos campos cuando la clase B es referenciado desde A.

¿Esto es posible con JAX-B?

Respuesta

7

Los enlaces JAXB predeterminados pueden anularse en un ámbito global o caso por caso según sea necesario utilizando custom binding declarations o use @XmlTransient en el campo.

+0

Gracias! Supongo que complica las cosas un poco si estoy usando la implementación de Glassfish JAXB ... Parece que no hay una solución basada en anotaciones y necesito crear un XML de personalización adicional. –

86

Puede usar la anotación @XmlTransient para ignorar los campos. Coloque esta anotación en el campo en sí o en su getter.

+0

¿Dónde debería ponerlo? En los campos 'b' class' field1' y 'field2' ¿No provocaría que se eliminen los campos 'campo1' y' campo2' cuando se transforma ** una instancia de 'B' clase **? –

+0

Debe poner estas anotaciones en campos o métodos de clase B. Los campos de no se eliminarán.Simplemente no aparecerán en XML resultante – AlexR

+1

Gracias Alex, pero creo que es exactamente lo que no quiero hacer (consulte el último párrafo de mi pregunta). Este cambio prohibirá que los campos aparezcan en el XML resultante en ** todas las ocurrencias ** de la clase B. –

12

Ok, yo he llegado con un poco de solución hacky:

@XmlRootElement 
public class A { 

    private Long id; 
    private B b; 

    // setters and getters 
} 

que he proporcionado un captador adicional sólo para el caso de uso REST, así que es como:

@XMLTransient 
public B getB() { 
    return b; 
} 

@XMLElement(name="b") 
public Long getBForREST() { 
    return b.getId(); 
} 

Resultado en la siguiente estructura:

<a> 
    <id>2</id> 
    <b>5</b> 
</a> 

No es exactamente la misma estructura que apunté para que funcione para mí.

No me gusta esta solución - un @XMLExclude({"field1", "field2"}) o algo así sería mucho más limpio en mi opinión.

Sin embargo, por ahora, funciona; es feo, pero funciona.

+3

Incluso puede hacer que el getter exclusivo para REST sea privado, para que no confunda a los usuarios de su clase. –

+0

No es feo, es perfecto, ¡gracias! –

Cuestiones relacionadas