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

lor*_*tol 9 java spring json jackson jackson-modules

我有一个实体:

@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;

}
Run Code Online (Sandbox Code Playgroud)

然后我有一个控制器,其目的是检索书籍,我的问题是,类型字段被包含在我的控制器的json响应中.任何方式我可以排除那些杰克逊序列化对象时延迟加载的字段?

这是我的ObjectMapper的配置:

Hibernate4Module hm = new Hibernate4Module();
hm.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false);
registerModule(hm);
configure(SerializationFeature.INDENT_OUTPUT, true);
Run Code Online (Sandbox Code Playgroud)

谢谢!

我无法将其标记为JsonIgnore,因为它将永远不在序列化框中.有时候我需要随书检索这些类型,然后我会在查询中使用"fetch join",这样它就不会为空.

小智 12

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

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

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

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

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

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

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

  • 在Spring JPA + Spring REST Controller解决方案中,这对我不起作用.当JSON序列化发生时,仍然会发生延迟提取... (5认同)
  • 这不是 JPA 2.1 与 EclipseLink 结合的正确答案!问题显然是 Jackson 通过调用 getter 检查“NON_EMPTY”的属性,并触发延迟加载!不幸的是,没有 AccesType“Field”Json Annotation 等,这会有所帮助。顺便说一句,我认为这是 Moxy 支持的方式(我认为它使用 JAXB 注释)。 (2认同)
  • @RonyeVernaes 添加`Hibernate5Module` Bean 后它对我有用。请参阅 http://stackoverflow.com/questions/21708339/avoid-jackson-serialization-on-non-fetched-lazy-objects 中 chrismarx 的回答。 (2认同)

小智 6

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

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)