问题背景
今天做一个需求,要求在搜索功能里新加一个过滤字段(布尔类型),在测试过程中,发现获取到的字段值为空。
问题分析
该字段定义为:
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开发手册,重新设计了名称。
参考链接:blog.csdn.net/qq_15037231… www.cnblogs.com/xtf2009/p/1…