MOXy 仅编组集合中的基础 class 成员

MOXy is only marshaling base class members in a collection

我有一个基础 class 声明如下:

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; }
}

和派生的 class 看起来像:

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; }
}

最后我有一个 class,我试图 return 作为来自 RESTful 网络服务调用的对象,其中包括 BaseClass 派生的集合 class 个实例,看起来很像:

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 时,仅包括基 class 中的成员。我如何让 Jersey / MOXy 编组整个 class 实例而不仅仅是基础 class 成员?虽然我在这里只显示了一个派生的 class,但我还有其他几个我想从列表中选择到 return,所以简单地使用 List<DerivedClass> 不是一个选项,因为它将排除 returning 列表中的任何其他 classes。

其他信息:

您需要使用 @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",...
  • 您可以查看 this answer,了解如何删除不需要的 属性 类型。

就JSON而言,使用Jackson不会有这种行为。您可以简单地使用 Glassfish 附带的 jersey-media-json-jackson(您可以将其添加为提供的范围中的依赖项),然后只需在应用程序中注册 JacksonFeature