Исключая поля в JAXB
У меня есть 2 класса:
@XmlRootElement
public class A {
private Long id;
private B b;
// setters and getters
}
и
@XmlRootElement
public class B {
private Long id;
private String field1;
private String field2;
// setters and getters
}
По умолчанию, если я преобразую экземпляр класса A
в XML, у меня будут все его поля (id
) и ссылочные поля класса B
(id
, field1
, field2
) следующим образом:
<a>
<id>2</id>
<b>
<id>5</id>
<field1>test1</field1>
<field2>test3</field2>
</b>
</a>
Можно ли изменить , какие поля из ссылочного класса B
включены в XML класса A
? Например. Я хочу сказать, что когда я преобразовываю экземпляр класса A
, я просто хочу получить id
из полей B
(no field1
и field2
), поэтому хочу получить:
<a>
<id>2</id>
<b>
<id>5</id>
</b>
</a>
Я не хочу постоянно комментировать класс B
(используя @XMLTransient
или @XMLElement
) для его достижения, так как есть случаи, когда я хочу экспортировать весь класс B
как есть (с id
, field1
и field2
.)
Я просто не хочу экспортировать все эти поля, когда класс B
ссылается на A
.
Возможно ли это с помощью JAX-B?
Ответы
Ответ 1
Вы можете использовать @XmlTransient
на поле. Также привязки JAXB по умолчанию могут быть переопределены в глобальной области или в каждом конкретном случае по мере необходимости с помощью пользовательских объявлений привязки.
Посмотрите Руководство по JAXB с сайта Baeldung для большего количества примеров.
Ответ 2
Вы можете использовать аннотацию @XmlTransient
для игнорирования полей. Поместите эту аннотацию на поле или его геттер.
Ответ 3
Хорошо, я придумал хакерское решение:
@XmlRootElement
public class A {
private Long id;
private B b;
// setters and getters
}
Я предоставил дополнительный геттер только для случая использования REST, так что:
@XMLTransient
public B getB() {
return b;
}
@XMLElement(name="b")
public Long getBForREST() {
return b.getId();
}
Это приводит к следующей структуре:
<a>
<id>2</id>
<b>5</b>
</a>
Это не совсем та же структура, на которую я нацелился, работает для меня.
Мне не нравится это решение - @XMLExclude({"field1", "field2"})
, или что-то в этом роде было бы намного чище, на мой взгляд.
Тем не менее - на данный момент это работает; это уродливо, но оно работает.