最近遇到了这样一个bug,场景是这样的就是A服务调用B服务,B服务在执行完查询语句后返回响应结果给A服务时,出现了以下异常:
feign.codec.DecodeException: Error while extracting response for type [java.util.List<yunping.com.system.entity.SysRole>] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of java.util.ArrayList<yunping.com.system.entity.SysRole>
out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.ArrayList<yunping.com.system.entity.SysRole>
out of START_OBJECT token
上面的错误信息是json无法反序列化将内存中的信息转化为对象,当时看到这个我也困惑了很久,这个程序都运行了很长时间了,以前都很稳定怎么突然出现这样的错误。后来通过调试才知道原因:
A服务通过feign调用B服务获取相关数据,B服务在执行相关sql后获取数据,但问题是通过相关条件查询时查询不到数据返回一个[]空数组,然后B服务直接将[]空数组返回给A服务,[]数组在反序列化时报错,我的想法是[]空数组无法和对象建立对应关系导致,当然如果由大佬有更好的想法欢迎指正。
(序列化:把Java对象转换为字节序列的过程。反序列化:把字节序列恢复为Java对象的过程。);
下面这张图为A服务的代码
下图为B服务的代码