出现问题

在完成上周工作时有一个接口出现了一个 empty string异常,刚开始还以为是我项目没重启导致的(因为我确信我的业务代码没有问题),然而事情并没有我想象中的简单。

首先来看这个异常

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_tomcat

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_tomcat_02

是在feign的解码器中抛出来的异常,解码失败了,说什么是空字符串,我还以为是第三方接口返回了一个空字符串?然后又调试,发现第三方接口返回的内容没有问题, 然后我就懵逼了

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_java_03

然后我只能说服自己要坚强,接下来就一步一步调

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_实体类_04

异常是在 feign解码时抛出来的,那好,我们在这里下个断点

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_java_05

发现是在进行json反序列化时抛出的异常, 那好,那我们就看看它是怎么反序列化的又是反序列化到哪个阶段出现了异常

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_字段_06

一直跟进来

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_字段_07


调用第三方接口设置超时 RestTemplate 调用第三方接口异常_实体类_08

发现确实是在反序列某个字段时出现的异常,那好,我倒要看看是哪个字段出现了问题(此时该靓仔已经感觉到了事情不对劲)

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_反序列化_09

到这里我突然反应过来,因为我们有同一生成代码的程序,而这个程序生成的实体类中的属性使用的是基本数据类型,例如 int double等, 感觉大事不妙,赶紧去把实体类中的属性都改成了引用类型,然后事情并没有那么简单

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_实体类_10

好吧那接着调,发现就这个字段有问题

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_java_11


然后我们看看它的值是什么,一看不得了,竟是个空串,空串本身没什么问题,但是我实体类用的是double类型的,所以下面进行setter,不得了,异常就来了

调用第三方接口设置超时 RestTemplate 调用第三方接口异常_字段_12

因为代码是自动生成的,该字段在我们生成的代码的程序里定义为double类型,但接口返回的确是一个String类型的,所以才会出现这个问题,解决也很简单,手动把那个属性改成String类型接收就行了,

这种问题往往也是我们在写代码时最容易忽略的,但是出现问题时我们要有解决问题的能力