Jackson踩坑记录

165 阅读1分钟

问题背景

今天做一个需求,要求在搜索功能里新加一个过滤字段(布尔类型),在测试过程中,发现获取到的字段值为空。

问题分析

该字段定义为:

Boolean isToRedis = false

在查看返回体中发现该字段名称变成了toRedis,判断问题和Jackson的序列化反序列化方式有关,查阅网上资料,发现Jackson2在初始化序列器时,对pojo类型对象会收集其属性信息,属性包括成员变量及方法,然后属性名称和处理过后的方法名称做为key保存到一个LinkedHashMap中。收集过程中会调用com.fasterxml.jackson. databind .util.BeanUtil中的legacyManglePropertyName方法用来处理方法名称,它会将get/set方法前缀,即get或set去掉,并将其后面的连续大写字符转换成小写字符返回。

而在SearchDTO中,使用了idea自带的getter/setter生成方法,如下所示:

public Boolean getToRedis() {
    return isToRedis;
}

public void setToRedis(Boolean toRedis) {
    isToRedis = toRedis;
}

可以看出,自动生成的getter/setter方法去掉了is,Jackson在反序列化时得到就是toRedis,和SearchDTO的字段匹配不上,所以字段值为空

解决方案

当时就是自己写了get/set方法,顺利地读到了值,后面查阅了阿里巴巴Java开发手册,重新设计了名称。

image.png

参考链接:blog.csdn.net/qq_15037231… www.cnblogs.com/xtf2009/p/1…