java xml jaxb java-ee-6

java - Excluyendo campos en JAXB



xml java-ee-6 (3)

Tengo 2 clases:

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

De forma predeterminada, si transfiero una instancia de la clase A al XML, tendré todos sus campos ( id ) y los campos de clase B referenciados ( id , field2 , field2 ) de esta manera:

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

¿Es posible modificar qué campos de la clase B de referencia se incluyen en el XML de la clase A ? Por ejemplo, quiero decir que cuando transformo una instancia de A clase, solo quiero obtener un id de la clase B (sin campos field1 y field2 ), así que quiero obtener:

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

No quiero anotar permanentemente la clase B (utilizando @XMLTransient o @XMLElement ) para lograrlo, ya que hay casos en los que quiero exportar toda la clase B tal como está (con id , field2 y field2 ).
Simplemente no quiero exportar todos estos campos cuando se hace referencia a la clase B de A

¿Es esto posible con JAX-B?



Ok, he venido con alguna solución hacky:

@XmlRootElement public class A { private Long id; private B b; // setters and getters }

He proporcionado un captador adicional solo para el caso de uso de REST, así que es como:

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

Resulta en la siguiente estructura:

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

No es exactamente la misma estructura a la que aspiraba, porque me funciona.

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.


Puede usar la anotación @XmlTransient para ignorar los campos. Ponga esta anotación en el campo mismo o su captador.