MOXy只是集合中的基类成员

时间:2015-02-10 06:21:06

标签: 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 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>不是一个选项,因为它会阻止返回任何其他类在列表中。

其他信息:

  • Netbeans 8.0.2
  • Glassfish 4.1(本地托管)
  • Oracle JDK 8U31(64位Windows)
  • Java EE 7

1 个答案:

答案 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",...
  • 您可以查看this answer,了解如何在不需要的情况下摆脱类型属性。

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