记RestTemplate请求解析json失败问题

记RestTemplate请求解析json失败问题

问题背景

微信请求获取openId的时候,执行下列代码报错,但是执行getForObject(sb.toString(),String.class)是正常的

代码 异常信息 异常信息提示JSONObject不支持text/plain的相应信息

排查思路

查看RestTemplate的配置

也是加了FastJson转换器的,配置上应该没问题,因为是从另一个项目复制过来的,那个项目是正常解析。

暂时没找到问题,debug跟踪调试下:

跟踪到org.springframework.web.client.HttpMessageConverterExtractor#extractData方法,可以看到FastJsonHttpMessageConverter已经注册进来的,SpringMVC会依次遍历转换器,当满足canRead()方法的时候会执行解析,如果未找到对应的解析器,则抛出Could not extract response: no suitable HttpMessageConverter found异常。

进入canRead方法,可以看到在判断MediaType的时候,FastJsonHttpMessageConvert只支持application/jsonapplication/x-www-form-urlencoded两种类型,所以这里判断未通过。

跟进getSupportedMediaTypes(),可以看到是由supportedMediaTypes保存支持的MediaType,但AbstractHttpMessageConvertersupportedMediaTypes是空List,显然,是交给了子类去实现。

查看FastJsonHttpMessageConverter,可以看到是继承了AbstractHttpMessageConverter,并在构造函数中调用的父类的构造函数,传递了两个MediaType进行初始化,显然这里并没有我们需要的text/plain类型。

接着我又看了下另一个项目的代码 emmmmm......

解决方法

找到原因了,解决方法也很简单: 1. 升级fastjson版本 2. 在初始化fastJsonHttpMessageConvert的时候手动设置下MediaType类型

因为我这个项目的fastJson依赖是在另一个基础jar包中,不方便修改,所以我选择后者,代码如下:

这样就OJBK了