2014-07-09 99 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> 

这应该让你更接近你在做什么之后,我想。