Could not extract response: no suitable HttpMessageConverter found for ..content type [text/html...]

简介: Could not extract response: no suitable HttpMessageConverter found for ..content type [text/html...]

现象重现

springboot框架的项目,使用RestTemplate 远程调用 第三方的接口 报错,报错信息如下:

中文翻译一下,也就是:

无法提取响应:没有找到适合响应类型的HttpMessage转换器

抽丝剥茧,分析原因

第一步:

因为使用的是RestTemplate 来请求第三方接口,而项目中也引入了jackson的依赖,所以先下一个结论:

RestTemplate 采用的是 MappingJackson2HttpMessageConverter转换器,默认处理json类型的数据

为什么说使用的是MappingJackson2HttpMessageConverter转换器?

我们知道RestTemplate中,使用了很多的转换器,那他是如何选择的,接下来看JacksonHttpMessageConvertersConfiguration 的源码:

双击 shift 键搜索:JacksonHttpMessageConvertersConfiguration,进入该类中

由此可以看出来添加 Jackson依赖后,SpringBoot 会自动帮你运行MappingJackson2HttpMessageConverter,这个转换工具类

需要注意的是这个转换工具类实现的前提是,自己没有定义该工具类,如果自己定义了的话,会优先使用自己定义的覆盖系统自带的

第二步:

我们知道了,RestTemplate 请求接收的是json类型数据,然后我们发现第三方的接口,返回结果的数据 content-type类型 为 text/html,所以才会造成调用端无法解析,导致报错。

解决方案

改下RestTemplateConfig配置类,增加支持 text/html类型的解析

package com.hidata.devops.config;
import java.util.Arrays;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
  private int timeoutms = 5 * 60 *1000;
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        RestTemplate restTemplate = new RestTemplate(factory);
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(
                MediaType.TEXT_HTML,
                MediaType.TEXT_PLAIN));
        restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);
        return restTemplate;
    }
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(timeoutms);//ms
        factory.setConnectTimeout(timeoutms);//ms
        return factory;
    }
}


相关文章
|
4天前
|
安全 Go
Golang深入浅出之-Go语言模板(text/template):动态生成HTML
【4月更文挑战第24天】Go语言标准库中的`text/template`包用于动态生成HTML和文本,但不熟悉其用法可能导致错误。本文探讨了三个常见问题:1) 忽视模板执行错误,应确保正确处理错误;2) 忽视模板安全,应使用`html/template`包防止XSS攻击;3) 模板结构不合理,应合理组织模板以提高可维护性。理解并运用这些最佳实践,能提升Go语言模板编程的效率和安全性,助力构建稳健的Web应用。
16 0
|
2天前
|
安全 Go 开发者
Golang深入浅出之-Go语言模板(text/template):动态生成HTML
【4月更文挑战第25天】Go语言的`text/template`和`html/template`库提供动态HTML生成。本文介绍了模板基础,如基本语法和数据绑定,以及常见问题和易错点,如忘记转义、未初始化变量、复杂逻辑处理和错误处理。建议使用`html/template`防止XSS攻击,初始化数据结构,分离业务逻辑,并严谨处理错误。示例展示了条件判断和循环结构。通过遵循最佳实践,开发者能更安全、高效地生成HTML。
8 0
|
5天前
|
Java 数据库
【java】RTF转HTML或者TEXT
【java】RTF转HTML或者TEXT
8 1
|
24天前
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
25 0
|
6月前
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
298 1
|
7月前
|
JavaScript 前端开发
前端基础 -JQuery之val,text,html
前端基础 -JQuery之val,text,html
51 1
|
4月前
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
176 0
|
PHP
php:html富文本提取text普通文本内容
php:html富文本提取text普通文本内容
88 0
|
移动开发 JavaScript 前端开发
[译]HTML进阶之Content categories
[译]HTML进阶之Content categories
[译]HTML进阶之Content categories
|
前端开发 程序员 Android开发
Sublime Text插件的离线安装-使用htmlprettify美化您的HTML代码
Sublime Text插件的离线安装-使用htmlprettify美化您的HTML代码
221 0
Sublime Text插件的离线安装-使用htmlprettify美化您的HTML代码