Spring boot 技术

今天中了Feign使用Jsckson Json序列化实体的枪

2019-08-12  本文已影响73人  jackieonway

Jackson Json和Fast Json等Json序列化工具是现在非常常见的,在项目中使用的非常广泛,但是使用过程中如果不注意待序列化实体的字段的命名方式,那么带来的将会是一个个惨案,今天就不幸中了序列化的枪。
在参数命名的时候完全规避了isXX打头的命名方式,使用的是Lombok方式,没有写getter和setter方法,但是在写一个验证字段大小的方法忽略了Json序列化的这个问题,最终在测试阶段,使用Feign远程调用的时候,发现其他的Feign都是正常能调用的,就是在调用使用了这个实体的Feign时候,总是返回NULL。
因此,单独打了一个断点在调用Feign的地方,一步一步的调试进去发现,执行的过程中出现了JsonMappingException,而这个JsonMappingException异常被Feign给吃掉了,没有被Feign给抛出,可能是Feign认为这个错误不会影响到程序的正常执行吧。

ExecutionResult{eventCounts=EventCounts{events={2, 9}, numEmissions=0, numFallbackEmissions=0, numCollapsed=0},
 failedExecutionException=feign.codec.EncodeException:
 Could not write JSON: (was java.lang.NullPointerException); 
nested exception is com.fasterxml.jackson.databind.JsonMappingException: 
(was java.lang.NullPointerException) (through reference chain: 
com.xxxx.domain.xxx.vo.xxxVo["equalOrBiggerThanXxxxLimit"]), 
executionException=feign.codec.EncodeException: 
Could not write JSON: (was java.lang.NullPointerException); 
nested exception is com.fasterxml.jackson.databind.JsonMappingException: 
(was java.lang.NullPointerException) (through reference chain: com.xxxx.domain.xxx.vo.xxxVo["equalOrBiggerThanXxxxLimit"]), 
startTimestamp=1565323065804, executionLatency=192, userThreadLatency=192, 
executionOccurred=true, isExecutedInThread=true, collapserKey=null}

遂检查该实体,发现了如下命名的方法


修改前.png

这个名字就是方法去掉了is后的结果,于是立马更改当前方法的命名,修改为如下:


修改后.png
重启服务之后再次调试,调用成功,完美解决了。

小结

由此可见,Json工具类在序列化实体的时候会将is开头的方法去掉is去反向查询字段,如果查询不到就会先抛NullPointerException,然后被捕捉然后再抛JsonMappingException。小伙伴在使用Json序列化实体的时候要在实体里写方法或字段的时候千万不要使用is开头,一定要记住今天的这个惨痛的教训。

任何形式的转载都请联系作者Jackieonway获得授权并注明出处。
微信搜索"JackieOnWay"关注我们,第一时间获取最新技术文摘。

上一篇下一篇

猜你喜欢

热点阅读