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/574349/

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

(0)

大家都在看

  • 开源C# WPF控件库《AduSkin – UI》

    追求极致,永臻完美 A Beautiful WPF Control UI 一款简单漂亮的WPF UI,融合部分开源框架的组件,为个人定制的UI,可供学者参考。https://www…

    Java 2023年5月30日
    0101
  • 【转】【数学】矩阵求逆的几何意义

    向量:[a1, a2, a3, …, an]矩阵:a11, a12, a13, …, a1na21, a22, a23, …, a2n&#823…

    Java 2023年5月29日
    0196
  • JDK成长记14:(深度好文)你能从3个层面分析volatile底层原理么?(下)

    上一节我们基本了解Volatile的作用,从JMM层面简单分析了下volatile可见性的实现要求。发现JMM设定了一些操作要求,在这些要求下,可以保证线程间的可见性。可是具体实现…

    Java 2023年6月5日
    079
  • JavaWeb2

    web服务器软件:Tomcat 1.1 概述 服务器:安装了服务器软件的计算机 服务器软件:接受用户的请求,处理请求,做出响应 web服务器软件:接受用户的请求,处理请求,做出响应…

    Java 2023年6月6日
    095
  • 小细节bug SpringCloud使用Feign项目启动报错 找不到Bean

    前言:记录一下工作中的小bug在微服务中用feign实现使用声明式的方法去远程接口调用但是在调用端 项目启动报错Bean未找到 检查步骤 检查springboot启动类是否标注@E…

    Java 2023年6月9日
    069
  • kafka小记

    1.kafka介绍 Kafka 是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。kafka官网:http://kafka.apache.org/ kafka介绍-名词解释…

    Java 2023年6月9日
    089
  • Git 使用入门

    学习之前,要明白一个概念: 版本控制 什么是版本控制 版本迭代,新的版本,需要版本管理器 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或…

    Java 2023年6月9日
    072
  • Hive数据仓库工具基本架构和入门部署详解

    @ 概述 定义 本质 特点 Hive与Hadoop关系 Hive与关系型数据库区别 优缺点 其他说明 架构 组成部分 数据模型(Hive数据组织形式) Metastore(元数据)…

    Java 2023年6月5日
    073
  • Git笔记

    Git 一个免费、开源的分布式版本控制系统,可以快速地处理从小型到大型的各种项目 集中式版本控制工具:SVN 分布式版本控制工具:Git Git常用命令 – git config …

    Java 2023年6月8日
    071
  • wait notify notifyAll await signal signalAll 的理解及示例

    从常见的一道面试题开始,题目的描述是这样子的: 有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… 网上大都教了你怎么去实现,其实我…

    Java 2023年6月5日
    0102
  • Java(14)对象构造

    之前学习了编写简单的构造器,可以定义对象的初始状态。但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制。 有些类有多个构造器。例如,可以如下构造一个空的 Strin…

    Java 2023年6月9日
    083
  • 7、常用类(String)

    帮助文档 注释 单行 // 多行 / / 文档注释 /* / 帮助文档就是通过文档注释生成的:jdk中提供了Javado c命令。可以将源代码中的文档注释提取出来,构成html格式…

    Java 2023年6月6日
    067
  • VMware安装虚拟机详细步骤

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    075
  • 源码中的设计模式–模板方法模式

    本文要解决的几个问题, 1、什么是模板方法模式; 2、模板方法模式的使用场景; 3、模板方法模式的优点; 4、源码中有哪些地方使用到了模板方法模式; 带着这几个问题,我们开始今天的…

    Java 2023年6月9日
    083
  • ThreadLocal 线程变量副本

    强引用:常常 new 出来的对象就是强引用类型,只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足的时候 软引用:使用 SoftReference 修饰的对象被称为…

    Java 2023年6月5日
    086
  • http网页状态码大全查询

    http网页状态码,是诸多站长经常接触到的东西,所谓的HTTP状态码,它是浏览器传输协议所响应的一种代码状态,不同的代码状态,反应了网页目前处于的状态,根据不同的状态码,可以判断出…

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