本文主要是介绍Jackson 忽略注解 @JsonIgnore 不生效,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题
- com.fasterxml.jackson.core
- jackson-databind:2.15.0
- jackson-annotation:2.15.0
// 设置保留字段
@Transient
@JsonIgnore // 注解不生效
private final transient String path = null;
原因
Jackson 版本 2.15.0
下, transient
关键字和 @JsonIgnore
冲突, 导致忽略失效
解决办法临时解决办法
- 方法1: 将
@JsonIgnore
注解放在 getter 方法上 - 方法2: 去掉
transient
- 方法3: 升级 jackson 到最新版本
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.17.2'
Reference
jackson-databind issue
- issue #3874: 2.15.0-rc1 regression: transient fields are serialized
- issue #3909: @JsonIgnore not working in 2.15.0 with transient fields having a public getter method
其他
- 字段忽略, 有两种方法
@JsonIgnore
注解
直接在希望忽略的字段上添加注解 @JsonIgnore
transient
关键字
除了使用上面的注解之外,也可以使用 jdk 原生提供的关键字 transient
来声明需要忽略的字段, 同时开启设置 (默认的场景下, 字段上修饰有 transient
关键字, 也不会忽略)
transient 是作用在 对象序列化 上的关键字 (如 jdk 自带的序列化到文件)
objectMapper = new ObjectMapper();
// 忽略 transient 关键字的配置 (2选1)
// case1
objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
// case2
objectMapper.setVisibility(objectMapper.getSerializationConfig().getDefaultVisibilityChecker().withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE).withIsGetterVisibility(JsonAutoDetect.Visibility.NONE));
- Jacskon 只会处理 public 修饰的成员 (pub属性 / get / set 方法)
- 必须有无参构造器
- 类至少包含一个属性 (
SerializationFeature.FAIL_ON_EMPTY_BEANS
)
No serializer found for class com.xxxx.TestBean \
and no properties discovered to create BeanSerializer \
(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
这篇关于Jackson 忽略注解 @JsonIgnore 不生效的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!