Подтвердить что ты не робот

Исключая поля в 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?

4b9b3361

Ответ 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"}), или что-то в этом роде было бы намного чище, на мой взгляд.

Тем не менее - на данный момент это работает; это уродливо, но оно работает.