问题描述
项目统一做了全局返回值处理之后,controller层的方法返回值是String类型,报错CommonResult cannot be cast to class java.lang.String
解决方案
最终的处理方法是,String类型的不做包装,直接返回成String类型的。
AbstractJackson2HttpMessageConverter.class.isAssignableFrom(aClass)
问题分析
看报错的内容,定位到下面的图
addDefaultHeaders(headers, t, contentType);
直接跟进去这个方法,感觉没问题。
再继续去上面找原因。
再向上查,查到下面的调用
((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage);
converter用的是StringHttpMessageconverter,但是body是CommonResult,感觉这里面可能有点问题;
继续跟进去,在StringHttpMessageconverter中找addDefaultHeaders()方法,如下图
发现接收的是String类型,但是实际上是CommonResult,这就出现了转换错误;问题的原因找到了。
解决方案分析
既然StringHttpMessageconverter处理不合适,就得考虑StringHttpMessageconverter是怎么来的,查找converter, 如下图:
看上面的截图,发现converter是this.messageConverters遍历的,然后再判断是否可以处理这个body;
但是此时的body没有经过我们全局返回值的处理,还是String类型的,此时是可以用StringHttpMessageconverter进行处理的,全局返回值处理的代码如下图:
经过全局返回值处理后的body已经变成了CommonResult,此时还是用的StringHttpMessageconverter处理,所以才会出现接下来的报错。
想法:
可以直接更改conveter的类型
看上面的调用,虽然全局返回值处理的时候接收到了conveter,但是是conveter.getClass(),所以不能更改conveter的类型。
最终决定,String类型不进行处理,直接返回。
如果有什么建议或者更好的方案,欢迎提出来。