jackson - 不序列化懒惰对象

2022-09-04 02:24:43

我有一个实体:

@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响应中。有什么方法可以排除那些在 jackson 序列化对象时延迟加载的字段吗?

这是我的对象映射器的配置:

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

谢谢!

我不能将其标记为JsonIgnore,因为它将永远脱离序列化框。有时我需要检索流派以及书籍,到那时,我将在我的查询中使用“fetch join”,因此它不会为空。


答案 1

您可以使用 Jackson 注释执行此操作。@JsonInclude

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

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

指定不包含空值或空值可以显著减小 JSON 响应的大小,并包括所有好处。

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

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

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

答案 2

您可以使用弹簧配置来禁用默认的强制延迟加载!

@Configuration
public class JacksonConfig {
    
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        Hibernate5Module hibernate5Module = new Hibernate5Module();
        hibernate5Module.configure(Feature.FORCE_LAZY_LOADING, false);
        // Enable below line to switch lazy loaded json from null to a blank object!
        //hibernate5Module.configure(Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
        mapper.registerModule(hibernate5Module);
        return mapper;
    }
}