ObjectMapper JSON与PO转换异常

Source
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/mingyundezuoan/article/details/101479532

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

异常反思

  • 接口调用出现异常,先排查接口调用方,然后再排查接口提供方
  • 是否参数传输问题,是否接口响应处理问题