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。
其他信息:
- Netbeans 8.0.2
- Glassfish 4.1(本地托管)
- Oracle JDK8U31(64 位Windows)
- Java EE 7
您需要使用 @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
。
我有一个基础 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。
其他信息:
- Netbeans 8.0.2
- Glassfish 4.1(本地托管)
- Oracle JDK8U31(64 位Windows)
- Java EE 7
您需要使用 @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
。