记RestTemplate请求解析json失败问题

举报
橘座 发表于 2019/10/14 20:43:42 2019/10/14
【摘要】 记RestTemplate请求解析json失败问题问题背景微信请求获取openId的时候,执行下列代***错,但是执行getForObject(sb.toString(),String.class)是正常的异常信息提示JSONObject不支持text/plain的相应信息排查思路查看RestTemplate的配置也是加了FastJson转换器的,配置上应该没问题,因为是从另一个项目复制过来的...

记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了

本文转载自异步社区

原文链接:https://www.epubit.com/articleDetails?id=N74ae94f1-c33d-4ef1-a787-459dcfaa0fed


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。