簡體   English   中英

具有@XmlTransient的JAXB抽象類

[英]JAXB abstract class with @XmlTransient

我正在使用JAXB將一些xml解組到一個對象中。

我有一個從抽象類繼承的類。 我已將抽象類標記為@XmlTransient。 然后,使用XMLType PropOrder可以訪問抽象類中的屬性,如下所示:

@XmlType( propOrder = { "id"...

涼。 問題是有時它不是我要訪問的元素,而是一個屬性。 通常,您可以使用@XMLAttribute定義此類屬性,以指示該值存儲在xml屬性中而不是元素中。 但是考慮到我已經在定義“ id”的抽象類上使用過XMLTransient的事實,當我嘗試將字段標記為@XMLAttribute時,JAXB會抱怨。

JAXB抱怨我試圖訪問/返回兩個具有相同名稱的字段。

誰能指出我正確的方向? 我正在為GAE進行開發,因此我真的不想使用任何其他庫。

提前致謝!

以下是您可以做的幾件事:

Java模型

您可以使用@XmlAttribute在父類上注釋屬性。

import javax.xml.bind.annotation.*;

@XmlTransient
public class Foo {

    private String att1;
    private String att2;

    @XmlAttribute
    public String getAtt1() {
        return att1;
    }

    public void setAtt1(String att1) {
        this.att1 = att1;
    }

    public String getAtt2() {
        return att2;
    }

    public void setAtt2(String att2) {
        this.att2 = att2;
    }

}

酒吧

您可以覆蓋子類上的屬性,並使用@XmlAttribute對其進行@XmlAttribute

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Bar extends Foo {

    @Override
    @XmlAttribute
    public String getAtt2() {
        return super.getAtt2();
    }

    @Override
    public void setAtt2(String att2) {
        super.setAtt2(att2);
    }

}

示范代碼

演示

這是一些演示代碼,您可以運行它們來演示一切正常。

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Bar.class);

        Bar bar = new Bar();
        bar.setAtt1("a");
        bar.setAtt2("b");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(bar, System.out);
    }

}

產量

以下是運行演示代碼的輸出:

<?xml version="1.0" encoding="UTF-8"?>
<bar att1="a" att2="b"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM