RestTemplate-解决中文乱码

【原文链接】:https://blog.tecchen.xyz ,博文同步发布到博客园。
由于精力有限,对文章的更新可能不能及时同步,请点击上面的原文链接访问最新内容。
欢迎访问我的个人网站:https://www.tecchen.xyz

在开发扇贝-每日一句时,使用RestTemplate请求扇贝接口,并保存返回的数据。原本正常的代码,经过架构升级后,请求接口时,会返回乱码数据。经过直接访问接口等形式,最终确认是RestTemplate这个bean有问题。
对RestTemplate的声明也比较简单,通过对apache的httpclient进行封装,返回bean实例。代码如下:

@Bean
RestTemplate restTemplate() {
    return new RestTemplate(httpRequestFactory());
}

通过断点debug发现以String格式接收数据时,底层采用的是StringHttpMessageConverter来处理请求。查看RestTemplate的构造方法如下:

public RestTemplate() {
    this.messageConverters = new ArrayList();
    this.errorHandler = new DefaultResponseErrorHandler();
    this.uriTemplateHandler = new DefaultUriBuilderFactory();
    this.headersExtractor = new RestTemplate.HeadersExtractor();
    this.messageConverters.add(new ByteArrayHttpMessageConverter());
    this.messageConverters.add(new StringHttpMessageConverter());
    this.messageConverters.add(new ResourceHttpMessageConverter(false));
    this.messageConverters.add(new SourceHttpMessageConverter());
    this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    if (romePresent) {
        this.messageConverters.add(new AtomFeedHttpMessageConverter());
        this.messageConverters.add(new RssChannelHttpMessageConverter());
    }

    if (jackson2XmlPresent) {
        this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
    } else if (jaxb2Present) {
        this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
    }

    if (jackson2Present) {
        this.messageConverters.add(new MappingJackson2HttpMessageConverter());
    } else if (gsonPresent) {
        this.messageConverters.add(new GsonHttpMessageConverter());
    } else if (jsonbPresent) {
        this.messageConverters.add(new JsonbHttpMessageConverter());
    }

    if (jackson2SmilePresent) {
        this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter());
    }

    if (jackson2CborPresent) {
        this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());
    }
}

其中的StringHttpMessageConverter构造方法使用了默认字符集:ISO-8859-1。

public class StringHttpMessageConverter extends AbstractHttpMessageConverter {
    public static final Charset DEFAULT_CHARSET;
    ......

    public StringHttpMessageConverter() {
        this(DEFAULT_CHARSET);
    }
    ......

    static {
        DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
    }
}

private final List

  • 示例代码一
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
  • 示例代码二
for (HttpMessageConverter httpMessageConverter : restTemplate.getMessageConverters()) {
    if (httpMessageConverter instanceof StringHttpMessageConverter) {
        ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
    }
}
  • 示例代码三
// stream .findFirst(); 也是可以的
Optional> converter = restTemplate.getMessageConverters().stream().filter(c -> c instanceof StringHttpMessageConverter).findAny();
if(converter.isPresent()) {
    ((StringHttpMessageConverter) converter.get()).setDefaultCharset(Charset.forName("UTF-8"));
}

Original: https://www.cnblogs.com/Candies/p/10398584.html
Author: Candyメ奶糖
Title: RestTemplate-解决中文乱码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684847/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一个被封禁的开源框架

    前言 2年前曾整过一个开源框架——违禁词过滤框架LiteBanner。 算是一个工具类的,当时放在开源中国。因为小巧性能高,还可以自定义词库,获得了不少人的star。 因为框架自带…

    技术杂谈 2023年7月11日
    064
  • Python数据分析–Numpy常用函数介绍(8)–Numpy中几中常见的图形

    在NumPy中,所有的标准三角函数如sin、cos、tan等均有对应的通用函数。 一、利萨茹曲线 (Lissajous curve)利萨茹曲线是一种很有趣的使用三角函数的方式(示波…

    技术杂谈 2023年7月25日
    073
  • 8086 汇编

    8086 汇编 1、8086汇编 介绍 2、8086汇编 内存交互 3、8086汇编 CPU 寄存结构 4、8086汇编 Debug 使用 5、8086汇编 段寄存器 6、8089…

    技术杂谈 2023年6月1日
    097
  • java 8 新特性

    java8 是一个有里程碑的一个版本,提供了很多的新特性,但这些新特性是实打实有用的,而不是一些鸡肋 接口新特性 java8 之前,往接口里新加一个方法,那么所有的实现类都需要变动…

    技术杂谈 2023年7月24日
    058
  • iOS 字符串 去除空格

    NSString *str = @” this is a test . “; 去掉两端的空格 str = [str stringByTrimmingCharactersInSet:…

    技术杂谈 2023年5月30日
    077
  • 区间dp

    顾名思义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。 核心思路 既然让我求解在一个区间上的最优解…

    技术杂谈 2023年7月11日
    056
  • segment fault 段错误 (core dumped)的起因分析(转)

    内核使用内存描述符结构体表示进程的地址空间,该结构体包含了和进程地址空间有关的全部信息。内存描述符由mm_struct结构体表示,定义在文件 mm_users域记录正在使用该地址的…

    技术杂谈 2023年6月1日
    095
  • dremio 当前支持的权限

    了解dremio 当前支持的权限,可以让给你我们更好的处理以及学习dremio的安全控制机制 数据集权限 alter 对于system,space,source,folder,pd…

    技术杂谈 2023年5月30日
    0132
  • 使用对象流传输Student类

    上一篇博客已经介绍了如何通过定义原始的字节流来传输Student类,我们接下来继续练习如何通过对象流传输Student类。因为通过对象流传输的对象以及所包含的变量都必须要实现Ser…

    技术杂谈 2023年7月23日
    067
  • python -m参数

    把模块当做脚本运行,标准库和第三方库都可以 会把当前路径添加到sys.path中 posted on2021-06-04 20:24 Go_Forward 阅读(28 ) 评论()…

    技术杂谈 2023年7月11日
    076
  • quartz框架(六)-ThreadPool

    本篇博文,博主将介绍Quartz框架中ThreadPool线程池相关的内容。线程池顾名思义,就是一个可以帮助我们来进行线程资源管理的对象。在web开发中,常见的就有数据库连接池,h…

    技术杂谈 2023年7月24日
    080
  • SIP穿越NAT SIP穿越防火墙-SBC

    SIP穿越NAT SIP穿越防火墙-SBC https://www.cnblogs.com/jhcelue/p/7258803.html FireWall&NATFireW…

    技术杂谈 2023年5月31日
    084
  • maven常用命令和maven指令生命周期以及maven概念模型图

    ; ; maven常用命令 clean:把我们自己编译好的项目中的信息删除掉,清除本地编译好的信息 mvn compile:是吧src main下的方法进行编译放置在target目…

    技术杂谈 2023年6月21日
    0108
  • 湘潭大学新生匿名问答网站——解湘 项目总结

    一.开发进度 温馨提示:左下角有音乐播放器 项目首页 大一暑假过半,7月29日建立本地工程文件 其中项目在github上经历七次push(第八次为修改配置文件,防止数据库泄露),但…

    技术杂谈 2023年7月11日
    083
  • Laravel新增路由文件配置

    简介: 如下,以6.0版本框架,新建一个路由文件,并且使用laravel的中间件,实现简单的登录验证。 生成路由的流程: 1:创建控制器文件:php artisan make:co…

    技术杂谈 2023年7月11日
    0103
  • 2019Hexo博客Next主题深度美化 打造一个炫酷博客(2)-奥怪的小栈

    219/8/1 更新本文转载于:奥怪的小栈 这篇文章告诉你在搭建好博客后,面对网上千篇一律的美化教程怎么才能添加自己独特点,使人眼前一亮. 本站基于HEXO+Github搭建。所以…

    技术杂谈 2023年6月21日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球