现象:
公司的一个springboot项目,由于pojo类的字段都是全大写的,刚开始开发的时候在每个字段上添加了jackson的@JsonProperty(value=”USERID”)注解,用来控制返回json为全大写字段。在项目开发过程中发现了lombok工具可以减少getter/setter的代码,便引入进了项目中,删除了所有pojo的getter/setter方法。后来经前端发现,在部分API接口返回的json中同时包含了大写和小写的pojo字段各一遍。
解决:
发现问题之后,一度以为是lombok导致的。后来经查询jackson的原因导致的,jakson把JsonProperty放到字段名上的时候,需要在getter方法上写上JsonIgnore注解,但是由于getter方法是lombok自动生成的,重新手动插入太浪费时间,于是切换了fastjson作为json序列化的工具。
顺便记录一下切换步骤:
引入fastjson包
1 | <dependency> |
启动类中重写转换方法
1 | /** |
jackson序列化出现两遍的原因
经查询得知,jackson2在初始化序列器时,对pojo类型对象会先收集其属性信息,包括成员变量和方法,然后以属性名称和处理过后的方法名称作为key保存到一个LinkedHashMap中。收集过程中会调用com.fasterxml.jackson.databind.util.BeanUtil中的legacyMangleProperName方法来处理方法名称,它会将get/set方法前缀,即get或set去掉,并将其后面的连续大写字符转换成小写返回。收集完属性信息之后,下面会删除掉非可见的属性,一般是指的私有成员变量;但,如果加了@JsonProperty注解,Jackson2会认为这个属性是可见的,不会进行删除,此时就会出现两个同一个值得属性被一同序列化。