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?
Los enlaces JAXB predeterminados pueden anularse en un ámbito global o caso por caso según sea necesario mediante el uso de declaraciones de enlace personalizadas o utilizar @XmlTransient en el campo.
Echa un vistazo a este ejemplo del sitio web de Baeldung, Guía de JAXB .
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.