问题描述:
开发中经常会打印一些实体类的日志,方便问题追溯等,在一次实体类改动后发现JSONObject.toJSONString(实体类)发生了异常,导致其所在方法异常,by错误日志排查定位实体类中某个getXXX()方法空指针,注意,当前方法是get开头且无参的方法
问题排查:
首先疑问,为什么打印实体类会扫描到这个方法?往下追过源码,太多没看完..我猜测是把这个方法当成属性的get方法了?
随后去网上搜索,看到了这个文章
随后本地进行测试,方法内增加了log,发现改名前会扫描到方法,将方法名修改(我把get换成了其他词汇)后就扫描不到了!又展开测试了下,除了方法名以'get'开头,是否还有其他影响因素呢?实体类内新增了一个get开头,但是有参数的方法,同样方法内打印了日志用于判断是否扫描执行了该方法,发现并未扫描到。
一些测试:
控制台结果:
2:
控制台结果:
可见,只扫描了无参的getCycle方法,且返回值类型非void
问题总结:
综上,根据测试结果推测和建议,使用FastJson时,待解析的实体类内的方法一定谨慎命名,尤其是无参的get方法,可能是被当作属性的get方法了所以被扫描到,如果一定要这样命名,做好方法内的空值兼容,综合搜索和个人总结,以下是一些处理方式
1、用gson代替fastjson
2、使用fastjson,待解析实体类尽量避免get开头命名的无参方法
3、使用fastjson,不想被方法命名限制,方法内部做好空值兼容处理
参考文章