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.