ObjectMapper 对JSON与PO转换异常
异常场景
- 应用A通过HTTP接口调用应用B,部分用户请求接口响应正常,部分不可以
异常排查
- 用户维度:对比两种用户数据,没有明显差别
- 日志查询:请求正常的用户比请求异常的用户多打印了一个属性的返回值;并没有过多留意
- 代码排查:检查应用B的代码,从上到下,没有查询到会出现过滤数据的代码;添加日志,等待发布生产再查
- 接口响应:查询应用A调用的结果,发现返回值中的data数据为空,于是定位问题根源不在于应用B;因为A调用B的逻辑十分简单,只是将返回的JSON转换后返给前端展示,重点没有放在应用A上
- 本地模拟:模拟A对B的接口请求,对响应值使用A中的工具类进行转换,定位问题原因在于某类客户,返回值中的某个属性List为null,导致部分用户请求不可以
异常原因
- 应用A中的接口入参、出参均引用应用B的VO类及Param类,部分VO类中的属性添加了@JsonIgnore 注解,后期应用B的业务扩展,增加了新的属性,但属性可能为空
org.codehaus.jackson.map.ObjectMapper.readValue(json,class)
方法在将JSON转为Class时若某个属性为空,会出现转换异常- 且同时工具类在调用时使用了try/catch导致异常没有抛出,转换失败同样返回成功
异常解决
- VO 返回值中对可能为空的属性添加
@JsonIgnore
注解 - 替换 JSON 转换的工具类,改为fastJson中的
JSON.parseObject
异常反思
- 接口调用出现异常,先排查接口调用方,然后再排查接口提供方
- 是否参数传输问题,是否接口响应处理问题