java - MOXy 仅编码集合中的基类成员

标签 java collections jersey jersey-2.0 moxy

我有一个基类声明如下:

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/

相关文章:

java - 比较不同类型的列表

java - 如何使用 Jersey 2.0 发布表单

java - 在 Jersey 中返回 XML/JSON

java - 在 JAVAEE Glassfish 中启用 FormDataMultiPart 或 @FormDataParam

java - JMeter4.0 - 采样器请求插件不获取更新的计数器值

java游戏在更快的cpu上口吃

Java Collections.sort() 缺少 ConcurrentModificationException

java - @ParametersAreNonnullByDefault 是否也适用于方法返回值?

java - 当对象更改时更新 JTable 中的数据

java - 在同一 arraylist 上使用 addall 和 removeall 的并发修改异常