2012-10-01 79 views
8

我們在一個屬性上有一個帶有JAXB註釋的類。然後我們有幾個子類來註釋其餘的重要數據。然而,我們有一個子類,我們想忽略父類的註釋,所以它不會被編組。這是一些示例代碼。如何忽略父類中的JAXB批註屬性?

父類:

@XmlType(name="Request") 
@XmlAccessorType(XmlAccessorType.NONE) 
public abstract class Request { 
    @XmlElement(required=true) 
    private UUID uuid; 

    ... setter/getter 
} 

現在的子類:

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data1; 

    ... setters/getters ... 
} 

當我masrhall具體類的實例,我得到以下XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <uuid>uuid</uuid> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

,我想XML像這樣:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ConcreteRequest> 
    <data1>data</data1> 
    <data2>data</data3> 
</ConcreteRequest> 

我們有其他的實現請求,但是這需要UUID,這只是一個特例。有沒有辦法忽略我的ConcreteRequest中的UUID字段?

回答

6

我希望我明白你的問題。這是解決方案。

JAXB提供@XmlTransient(javax.xml.bind.annotation.XmlTransient)(javadoc)在編組期間忽略任何字段。

覆蓋領域以其correspoding的getter/setter方法沿着 「的uuid」@XmlTransient在派生類(ConcreteRequest.class)。有必要重寫Getter/Setter方法,這些將在編組期間被調用。

@Xsd(name="concreteRequest") 
@XmlRootElement("ConcreteRequest") 
@XmlType(name="ConcreteRequest") 
@XmlAccessorType(XmlAccessorType.FIELD) 
public class ConcreteClass { 
    @XmlElement(required=true) 
    private String data1; 
    @XmlElement(required=true) 
    private String data2; 
    @XmlTransient 
    private UUID uuid; 

    ... setters/getters ... 
} 

這將覆蓋您的基類屬性。

回到我身邊獲取更多信息。

+0

不幸的是,我不認爲這是可能的在我的情況。 UUID字段被保存在我們的數據庫中,因此重寫它會很危險。 基本上我的類是一個特殊的子類,它有一個UUID,但它不屬於XML模式。 – prozaak

+0

從我的分析中,JAXB沒有爲您的需求提供合適的選項,我建議使用JAXB行爲 - 「當@XmlElement(nillable = false)時,空值元素將被忽略」。因此,在編組時將值「uuid」顯示爲空,以便在編組期間不會構建屬性。 我有一段代碼示例,但無法在這裏分享。 – omega

+0

這只是不起作用。 – GoalBased

0

你可以在派生類中使用

@XmlAccessorType(XmlAccessType.NONE) 

在父類和

@XmlAccessorType(XmlAccessType.FIELD)