一、过滤掉值为null的字段
有的时候我们不需要返回值为 null 的字段,可以在对应的实体类上加注解
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class JsonMsg
但是如果有很多个实体类的话,一个一个的去加注解就显得很麻烦,可以直接在配置文件中进行配置
二、jackson给对象字段序列化-反序列化设置别称
有时候字段的名称(比如password)过长,可以采用设置别名的方式来简化数据输入(password简化成pwd)
只需要在对应的实体类的字段上加上注解@JsonProperty
然后配置注解的 value 属性即可。
@JsonProperty(value = "pwd")
private String password;
三、jackson对hibernateLazyInitializer属性序列化异常
最简单直接的方式,直接忽略掉这个字段的信息(不显示)
详细解释:
仔细看了下报错信息,发现直接原因是: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的方法来达到目的:
@SpringBootApplication
@Configuration
public class ProviderUserApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderUserApplication.class, args);
}
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}
}
四、jackson对象中双向引用出现递归调用的问题
@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。
jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归问题.
package com.ctguyxr.satokendemo.entity;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
/**
* Created By Intellij IDEA
*
* @author Xinrui Yu
* @date 2021/11/28 20:59 星期日
*/
@Entity
@Data
@Table(name = "t_city")
public class City {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@JsonManagedReference
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "city_id")
private List<College> colleges;
}
package com.ctguyxr.satokendemo.entity;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Data;
import javax.persistence.*;
import javax.persistence.criteria.CriteriaBuilder;
import java.util.List;
/**
* Created By Intellij IDEA
*
* @author Xinrui Yu
* @date 2021/11/28 21:00 星期日
*/
@Entity
@Data
@Table(name = "t_colleges")
public class College {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@JsonBackReference
@ManyToOne(cascade = CascadeType.ALL)
private City city;
}
请求示例: