2010-04-19 47 views
2

我們有這個XML:將元素用JAXB表示爲布爾值?

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

<ValueB/>將永遠不會有任何屬性或內部元素。它是一個布爾型元素 - 它存在(true)或不(false)。

JAXB生成一個帶有String valueA成員的Summary類,這很好。但對於VALUEB,JAXB生成VALUEB內部類和相應的成員:

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

但我想是boolean成員和沒有內部類:

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

,你該怎麼辦這個?

我不想重新生成類,我想只是手動更改代碼。


更新:與接受的答案線,我們創建是否VALUEB == NULL的新方法返回布爾值條件。

當我們使用Hibernate時,我們註釋了valueB與@Transient,並用Hibernate的@Column批註註釋了布爾型getter。

+0

你真的需要一個布爾型字段嗎?爲什麼不只是布爾getter/setter方法? – skaffman 2010-04-19 18:42:06

+0

是的,這就是我們所做的。 – 2010-04-20 16:11:33

回答

1

這是因爲它認爲這是一個commplexAttribute

而是將其更改爲一個布爾值,你也可以檢查null == valueB如果你把

@XmlElement(name = "ValueB", nillable='true') protected Summary.ValueB valueB; 在你的邏輯相當邏輯JAXB創建內部類。

或添加一個額外的沒有@XMl ....的getter,並返回valueB的計算狀態 也許你想要的可能是JAXB,我之前並不需要它。

+0

是的,這將工作。寧願沒有內在的課堂..會更簡單。 – 2010-04-19 14:51:01

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/>元素時,但是o當錯誤的時候處理它。

+0

在類上註解@XmlAccessorType(XmlAccessType.NONE),那麼不需要@XmlTransient,只會考慮顯式註釋的屬性。 – 2014-06-15 07:48:28

+0

還值得一提的是,getter和setter應該有布爾對象作爲返回類型(用於getter)和參數類型(用於setter)......使用原始類型或兩者都不適合我。 – 2017-01-26 04:33:29