2010-04-19 2 views
2

У нас есть XML:Представляющий элемент как логический с JAXB?

<Summary> 
    <ValueA>xxx</ValueA> 
    <ValueB/> 
    </Summary> 

<ValueB/> никогда не будет иметь каких-либо признаков или внутренних элементов. Это элемент типа boolean - он существует (true) или не имеет значения (false).

JAXB сгенерировал класс Summary с элементом String valueA, который является хорошим. Но для VALUE млрд, JAXB произвел внутренний класс VALUE млрд и соответствующий элемент:

@XmlElement(name = "ValueB") 
protected Summary.ValueB valueB; 

Но то, что я хотел бы это boolean члена и не внутреннего класса:

@XmlElement(name = "ValueB") 
protected boolean valueB; 

Как вы можете сделать это?

Я не хочу восстанавливать классы, я хотел бы просто изменить код вручную.


Update: В соответствии с принятым ответ, мы создали новый метод, возвращающий логическое значение обусловливающие ли == NULL VALUE млрд.

Поскольку мы используем Hibernate, мы аннотировали значение B с @Transient и аннотировали булевский геттер с аннотацией @Column Hibernate.

+0

Вам действительно нужно булево поле? Почему бы не просто логические методы getter/setter? – skaffman

+0

Yup, это то, что мы сделали .. –

ответ

1

Это вполне логично JAXB создает внутренний класс, как он думает, что это commplexAttribute

Вместо того, чтобы изменить его в булево вы также можете проверить null == valueB если вы поставите

@XmlElement(name = "ValueB", nillable='true') protected Summary.ValueB valueB; в вашей логике.

или добавить дополнительный геттер, который не имеет @XMl .... и возвращает вычисленное состояние valueB возможно, что вы хотите, возможно, с JAXB. Мне он не нужен раньше.

+0

Yup, это сработает. Предпочитал бы не иметь внутреннего класса .. было бы проще. –

6

Используйте XmlAdaptor:

package com.example.xml.adaptor; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class BooleanToEmptyObjectAdapter extends XmlAdapter<EmptyObject, Boolean> { 
    @Override 
    public EmptyObject marshal(final Boolean v) { 
     return v != null && v ? new EmptyObject() : null; 
    } 

    @Override 
    public Boolean unmarshal(final EmptyObject v) { 
     return true; 
    } 
} 

И фиктивный объект для его сериализации:

package com.example.xml.adaptor; 

public class EmptyObject { 
    // EMPTY 
} 

Затем в объекте, используйте (не boolean) поле Boolean:

@XmlRootElement(name = "FooElement") 
public class Foo { 

    @XmlElement() 
    @XmlJavaTypeAdapter(BooleanToEmptyObjectAdapter.class) 
    private final Boolean isPresent = false; 

    ... 
    // You might need to @XmlTransient your getter/setter, or JAXB might complain about redefinition 
    @XmlTransient 
    public boolean isPresent() { 
     return this.isPresent; 
    } 
} 

Это должно произвести элемент <isPresent/>, если true, но o снимите его, когда ложь.

+0

Аннотировать @XmlAccessorType (XmlAccessType.NONE) в классе, тогда @XmlTransient не требуется, будут учитываться только явно аннотированные свойства. –

+0

Также стоит упомянуть, что геттер и сеттеры должны иметь Boolean-объект в качестве возвращаемого типа (для getter) и типа параметра (для сеттера) ...использование примитивного типа на одном или обоих не работало для меня. –

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