记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/json
和application/x-www-form-urlencoded
两种类型,所以这里判断未通过。
跟进getSupportedMediaTypes()
,可以看到是由supportedMediaTypes保存支持的MediaType,但AbstractHttpMessageConverter
的supportedMediaTypes
是空List,显然,是交给了子类去实现。
查看FastJsonHttpMessageConverter,可以看到是继承了AbstractHttpMessageConverter,并在构造函数中调用的父类的构造函数,传递了两个MediaType进行初始化,显然这里并没有我们需要的text/plain类型。
接着我又看了下另一个项目的代码emmmmm......
解决方法
找到原因了,解决方法也很简单: 1. 升级fastjson版本 2. 在初始化fastJsonHttpMessageConvert的时候手动设置下MediaType类型
因为我这个项目的fastJson依赖是在另一个基础jar包中,不方便修改,所以我选择后者,代码如下:
这样就OJBK了
本文转载自异步社区
原文链接:https://www.epubit.com/articleDetails?id=N74ae94f1-c33d-4ef1-a787-459dcfaa0fed
- 点赞
- 收藏
- 关注作者
评论(0)