问题描述
||
在Jersey中,当使用Jackson进行JSON序列化时,不包括实现子类的额外属性。例如,给定以下类结构
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,property=\"@class\")
@JsonSubTypes({
@JsonSubTypes.Type(value = Foo.class,name = \"foo\")
}
public abstract class FooBase {
private String bar;
public String getBar() {
return bar;
}
public void setBar( String bar ) {
this.bar = bar;
}
}
public class Foo extends FooBase {
private String biz;
public String getBiz() {
return biz;
}
public void setBiz( String biz ) {
this.biz = biz;
}
}
和以下泽西岛代码
@GET
public FooBase get() {
return new Foo();
}
我回到下面的json
{\"@class\" => \"foo\",\"bar\" => null}
但是我真正想要的是
{\"@class\" => \"foo\",\"bar\" => null,\"biz\" => null}
另外,在我的web.xml中,我启用了POJOMappingFeature来解决此问题
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
编辑:修复了Java代码,以正确设置设置程序,而Foo不是抽象的
解决方法
它应该如您所展示的那样工作;有一个可能的例外:如果启用JAXB批注(仅),则JAXB限制要求仅使用getter / setter对来检测属性。
因此,请尝试为\'biz \'添加二传手,看看是否会改变它。
对于Jackson注释,这不会发生。最好不要同时使用Jackson和JAXB注释(我以为Jersey都启用了)。
如果还启用了Jackson注释处理,则在\'getBiz \'旁边添加@JsonProperty也可以解决问题。
最后,除非您需要JAXB批注,否则您可以只使用杰克逊批注-在我看来,JAXB批注的主要用例是如果您需要同时生成XML和JSON,并且对XML使用JAXB(通过Jersey)。否则,它们对JSON无效。
, 使用
POJOMappingFeature
,您还可以使用JAXB注释类:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class FooBase {
private String bar;
}
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo extends FooBase {
private String biz;
}