簡體   English   中英

JAXB:處理根元素

[英]JAXB: Dealing the with Root Element

對於不同的Rest調用,我具有不同的Response類。 但是它們都處理同一個Entity 最初我是因為沒有從Response類中告訴JaxB有關Entity類。 通過使用@XmlSeeAlso({Entity.class}) 現在,我試圖在Response類中修復根元素名稱。
Issue1:

@XmlRootElement(name="?")
@XmlSeeAlso({Entity.class})
public class FindAllResponse 
    extends ListResponse<Entity> 
{
    /**
     * serial version uid
     */
    private static final long serialVersionUID = xxx;
}

預期的響應是
<Response> <Entities> <Entity></Entity> </Entities> <Response>
如何將<Response><Entities>根添加到上述響應類。
Issue2:

@XmlRootElement(name="?")
@XmlSeeAlso({Entity.class})
public class FindEntityResponse 
    extends Response<JobType> 
{


    @JsonUnwrapped
    public Entity getValue() {
        return super.getValue();
    }

}

在這種情況下,預期響應沒有任何根元素。 預期響應xml只是從<Entity></Entity>
@XmlRootElement針對問題1使用@XmlTransient@XmlRootElement進行嘗試,但沒有運氣。

您需要將Entity類包裝在分別定義ResponseEntities根元素的類中。

基本的東西:

// this class will represent your Response element and all attributes
@XmlRootElement(name="Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
    @XmlElement(name="Entities")
    private Entities myEntities;

    public Response() {
        myEntities = new Entities();
    }

    public Entities getMyEntities() { return myEntities; }
    public void setMyEntities(Entities entities) { this.myEntities = entities; }
}


// this class will represent the collection of Entities
@XmlRootElement(name="Entities")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entities {
    @XmlElement(name="Entity")
    private List<Entity> entities;

    public Entities() {
        entities = new ArrayList<Entity>();
    }

    public List<Entity> getEntities() { return this.entities; }
    public void setEntities(List<Entity> entities) { this.entities = entities; }
}

// a simple Entity class (I don't know what yours is)
@XmlRootElement(name="Entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity {
    @XmlAttribute(name="id")
    private String id;

    public Entity() {}
    public Entity(String id) { setId(id); }

    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
}

最后,一個簡單的測試:

public class Test {
    public static void main(String[] args) throws Exception {
        Response r = new Response();
        Entities e = new Entities();
        e.getEntities().add(new Entity("1"));
        e.getEntities().add(new Entity("2"));
        e.getEntities().add(new Entity("3"));
        r.setMyEntities(e);

        JAXBContext context = JAXBContext.newInstance(Response.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        m.marshal(r, System.out);
    }
}

產生以下輸出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Response>
    <Entities>
        <Entity id="1"/>
        <Entity id="2"/>
        <Entity id="3"/>
    </Entities>
</Response>

我認為,這應該使您更接近所追求的目標。

暫無
暫無

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

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