2014-07-09 138 views
1

對於不同的Rest調用,我有不同的Response類。但他們都處理相同的Entity。 最初我得到的不是告訴JaxB關於Response類的實體類。這是通過使用@XmlSeeAlso({Entity.class})解決的。現在我試圖修復Response 類中的根元素名稱。
Issue1:JAXB:處理根元素

@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>開始。
嘗試使用@XmlTransient@XmlRootElement問題1,但沒有運氣。

回答

0

您需要將您的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> 

這應該讓你更接近你在做什麼之後,我想。