繁体   English   中英

泽西和杰克逊的子类序列化不包括额外的属性

[英]Jersey and Jackson serialization of subclasses does not include extra attributes

在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代码,使得setter设置正确,而Foo不是抽象的

它应该像你展示的那样工作; 有一个可能的例外:如果启用JAXB注释(仅限),JAXB限制要求只使用getter / setter对来检测属性。 所以尝试为'biz'添加setter,看看是否会改变它。

杰克逊注释不会发生这种情况; 如果你把杰克逊和JAXB注释结合在一起(我认为泽西启用了两者),理想情况下并非如此。 如果还启用了Jackson注释处理,则在'getBiz'旁边添加@JsonProperty也应该可以。

最后,除非你需要JAXB注释,否则你只能恢复使用Jackson注释 - 在我看来,JAXB注释的主要用例是你需要生成XML和JSON,并使用JAXB(通过Jersey)来实现XML。 否则它们对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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM