一尘不染

杰克逊-不要序列化惰性对象

json

我有一个实体:

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column
    private String title;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = ("movie"),cascade = CascadeType.ALL)
    private List<Genre> genre;

}

然后我有一个控制器,其目的是检索书籍,我的问题是,流派字段包含在控制器的json响应中。有什么办法可以排除杰克逊序列化对象时延迟加载的那些字段?

这是我的ObjectMapper的配置:

Hibernate4Module hm = new Hibernate4Module();
hm.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false);
registerModule(hm);
configure(SerializationFeature.INDENT_OUTPUT, true);

谢谢!

我不能将其标记为JsonIgnore,因为它将永远在序列化框中。有时候,我将需要随书一起检索体裁,然后在查询中使用“获取联接”,因此它不会为null。


阅读 163

收藏
2020-07-27

共1个答案

一尘不染

您可以使用Jackson @JsonInclude批注进行此操作。

根据最新版本的javadoc(当前为2.4),如果字段值为null或为空,则可以使用简单的注释指定是否包含带注释的属性。

默认情况下为,JsonInclude.Include.ALWAYS这意味着即使您懒惰的未加载值都为null,Jackson也会包含该属性。

指定不包含空值或null值可以显着减小JSON响应的大小,并具有所有优点。

如果要更改此行为,则可以在类级别或单个属性/ getterMethod级别添加注释。

如果为空,请尝试将以下注释添加到不想包含的字段中:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@OneToMany(fetch = FetchType.LAZY, mappedBy = ("movie"),cascade = CascadeType.ALL)
private List<Genre> genre;
2020-07-27