一、过滤掉值为null的字段

image.png
有的时候我们不需要返回值为 null 的字段,可以在对应的实体类上加注解

  1. @JsonInclude(JsonInclude.Include.NON_NULL)
  2. @Data
  3. public class JsonMsg

但是如果有很多个实体类的话,一个一个的去加注解就显得很麻烦,可以直接在配置文件中进行配置
image.png

二、jackson给对象字段序列化-反序列化设置别称

有时候字段的名称(比如password)过长,可以采用设置别名的方式来简化数据输入(password简化成pwd)
只需要在对应的实体类的字段上加上注解@JsonProperty 然后配置注解的 value 属性即可。

  1. @JsonProperty(value = "pwd")
  2. private String password;

image.png

三、jackson对hibernateLazyInitializer属性序列化异常

最简单直接的方式,直接忽略掉这个字段的信息(不显示)

image.png

详细解释:

仔细看了下报错信息,发现直接原因是:jackson在对hibernate的持久化实体类的代理对象进行序列化时,代理类中的”hibernateLazyInitializer”属性为空,触发了系列化规划SerializationFeature.FAIL_ON_EMPTY_BEANS,即“出现空Bean时触发序列化失败”!
“hibernateLazyInitializer”属性为空之所以为空是因为我们禁用了延迟加载(open-in-view: true),设为false又会引发no Session错误。
报错信息中告诉我们可以通过禁用jackson的SerializationFeature.FAIL_ON_EMPTY_BEANS这条系列化规则来避免该异常(异常信息中的红色字所示),我们可以通过以下方式使用禁用SerializationFeature.FAIL_ON_EMPTY_BEANS规则的新ObjectMapper替换默认的ObjectMapper的方法来达到目的:

  1. @SpringBootApplication
  2. @Configuration
  3. public class ProviderUserApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ProviderUserApplication.class, args);
  6. }
  7. @Bean
  8. public ObjectMapper objectMapper() {
  9. return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
  10. }
  11. }

四、jackson对象中双向引用出现递归调用的问题

@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。

jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归问题.

  1. package com.ctguyxr.satokendemo.entity;
  2. import com.fasterxml.jackson.annotation.JsonBackReference;
  3. import com.fasterxml.jackson.annotation.JsonManagedReference;
  4. import lombok.Data;
  5. import javax.persistence.*;
  6. import java.util.List;
  7. /**
  8. * Created By Intellij IDEA
  9. *
  10. * @author Xinrui Yu
  11. * @date 2021/11/28 20:59 星期日
  12. */
  13. @Entity
  14. @Data
  15. @Table(name = "t_city")
  16. public class City {
  17. @Id
  18. @GeneratedValue(strategy = GenerationType.IDENTITY)
  19. private Integer id;
  20. private String name;
  21. @JsonManagedReference
  22. @OneToMany(cascade = CascadeType.ALL)
  23. @JoinColumn(name = "city_id")
  24. private List<College> colleges;
  25. }
  1. package com.ctguyxr.satokendemo.entity;
  2. import com.fasterxml.jackson.annotation.JsonBackReference;
  3. import com.fasterxml.jackson.annotation.JsonIgnore;
  4. import com.fasterxml.jackson.annotation.JsonManagedReference;
  5. import lombok.Data;
  6. import javax.persistence.*;
  7. import javax.persistence.criteria.CriteriaBuilder;
  8. import java.util.List;
  9. /**
  10. * Created By Intellij IDEA
  11. *
  12. * @author Xinrui Yu
  13. * @date 2021/11/28 21:00 星期日
  14. */
  15. @Entity
  16. @Data
  17. @Table(name = "t_colleges")
  18. public class College {
  19. @Id
  20. @GeneratedValue(strategy = GenerationType.IDENTITY)
  21. private Integer id;
  22. private String name;
  23. @JsonBackReference
  24. @ManyToOne(cascade = CascadeType.ALL)
  25. private City city;
  26. }

请求示例:
image.png
image.png