我有一个基类声明如下:
package com.mystuff.surrogates;
import java.io.Serializable;
import java.util.UUID;
public class BaseClass implements Serializable {
private UUID id;
private String name;
public UUID getId() { return this.id; }
public void setId(UUID id) { this.id = id; }
public String getName() { return thisname; }
public void setName(String name) { this.name = name; }
}
派生类看起来像:
package com.mystuff.surrogates;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class DerivedClass extends BaseClass {
private String email;
public String getEmail() { return this.email; }
public void setEmail(String email) { this.email = email; }
}
最后,我有一个类,我试图从RESTful webservice调用返回一个对象,该调用包含BaseClass
派生类实例的集合,看起来很像:
package com.mystuff.surrogates;
import java.util.ArrayList;
import java.util.List;
public class Response {
List<BaseClass> objectList;
public List<BaseClass> getObjectList() { return this.objectList; }
public void setObjectList(List<BaseClass> objectList) { this.objectList = objectList; }
public void addObject(BaseClass obj) {
if (this.objectList == null) {
this.objectList = new ArrayList<>();
}
this.objectList.add(obj);
}
}
当将其编组为XML或JSON时,仅包括基类中的成员。如何让Jersey / MOXy编组整个类实例而不仅仅是基类成员?虽然我只在这里展示了一个派生类,但我还有其他几个我希望可以选择在列表中返回,所以简单地使用List<DerivedClass>
不是一个选项,因为它会阻止返回任何其他类在列表中。
其他信息:
答案 0 :(得分:1)
您需要使用@XmlSeeAlso
,以便其他类绑定。
@XmlSeeAlso({DerivedClass.class})
public class BaseClass {
这可能无法获得确切的预期结果,因为编组数据将引用该类型。例如,使用XML,您将看到
<objectList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="derivedClass">
你会看到和JSON
{"objectList":[{"type":"derivedClass",...
就JSON而言,使用Jackson不会有这种行为。您可以简单地使用jersey-media-json-jackson,Glassfish也附带(您可以将其作为依赖项添加到提供的范围内),只需在应用程序中注册JacksonFeature
。