2012-06-10 4 views
29

У меня есть 2 классов:исключающие поля в JAXB

@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 класса (без field1 и field2 полеев), так что я хочу получить:

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

Я не хочу постоянно аннотировать B класс (с помощью @XMLTransient или @XMLElement), чтобы достичь его, так как есть случаи, в которых я хочу экспортировать весь B класс как есть (с id, field1 и field2.)
Я просто не хочу, чтобы экспортировать все эти поля, когда класс B от A.

Возможно ли это с помощью JAX-B?

ответ

7

Связи JAXB по умолчанию могут быть переопределены в глобальном масштабе или в каждом конкретном случае при необходимости с использованием custom binding declarations или использовать @XmlTransient в поле.

+0

Спасибо! Я предполагаю, что это немного усложняет ситуацию, если я использую реализацию Glassfish JAXB ... Кажется, что нет никакого решения на основе аннотаций, и мне нужно создать дополнительный XML-файл настройки? –

86

Вы можете использовать аннотацию @XmlTransient для игнорирования полей. Поместите эту аннотацию на поле или его геттер.

+0

Куда я могу это поместить? В полях 'B'' field1' и 'field2'? Разве это не приведет к тому, что поле 'field1' и' field2' произойдет при преобразовании ** экземпляра класса 'B' **? –

+0

Вы должны поместить эти аннотации в поля или методы класса B. Поля не удаляются.Они просто не появятся в результате XML – AlexR

+1

Спасибо Алекс, но я думаю, что это именно то, что я не хочу делать (пожалуйста, обратитесь к последнему абзацу моего вопроса). Это изменение запретит появление полей в полученном XML в ** все вхождения ** класса B. –

12

Хорошо, я пришел с каким-то Hacky решение:

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

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

+3

Вы даже можете сделать доступным только для REST-getter, поэтому он не будет путать пользователей вашего класса. –

+0

Это не уродство, его идеальный, спасибо! –

Смежные вопросы