我有一个基类声明如下:
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 web 服务调用中返回,该调用包含 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>
不是一个选项,因为它会排除返回列表中的任何其他类。
其他信息:
- Netbeans 8.0.2
- Glassfish 4.1(本地托管)
- Oracle JDK 8U31(64 位 Windows)
- Java EE 7
最佳答案
您需要使用 @XmlSeeAlso
所以其他类是绑定(bind)的。
@XmlSeeAlso({DerivedClass.class})
public class BaseClass {
这可能无法为您提供所需的确切结果,因为编码数据将具有对该类型的引用。例如,对于 XML,您将看到
<objectList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="derivedClass">
你会看到 JSON
{"objectList":[{"type":"derivedClass",...
- 你可以看看this answer了解如何在不需要时摆脱 type 属性。
就JSON而言,使用Jackson不会有这种行为。您可以简单地使用 jersey-media-json-jackson ,Glassfish 也附带了它(您可以将其添加为提供范围内的依赖项),并且只需向应用程序注册 JacksonFeature
。
关于java - MOXy 仅编码集合中的基类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28425381/