【原文链接】: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<String> {public static final Charset DEFAULT_CHARSET;……public StringHttpMessageConverter() {this(DEFAULT_CHARSET);}……static {DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;}
}

private final List<HttpMessageConverter<?>> messageConverters
根据RestTemplate的构造方法的源码得知所有的HttpMessageConverter都是放在final List<HttpMessageConverter<?>> messageConverters这个常量集合中。虽然集合不可修改,但是可以对其中的元素StringHttpMessageConverter进行修改。
解决方案思路都是将ISO-8859-1的StringHttpMessageConverter替换为UTF-8的StringHttpMessageConverter。

  • 示例代码一
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<HttpMessageConverter<?>> converter = restTemplate.getMessageConverters().stream().filter(c -> c instanceof StringHttpMessageConverter).findAny();
if(converter.isPresent()) {((StringHttpMessageConverter) converter.get()).setDefaultCharset(Charset.forName("UTF-8"));
}

转载于:https://www.cnblogs.com/Candies/p/10398584.html

RestTemplate--解决中文乱码相关推荐

  1. java web乱码_【SpringBoot WEB 系列】RestTemplate 之中文乱码问题 fix

    [WEB 系列]RestTemplate 之中文乱码问题 fix 在 RestTemplate 基础用法博文中,post json 表单时,会发现存在中文乱码问题,本文主要介绍对应的解决方案 I. 中 ...

  2. sqlserver mysql 乱码_SQLServer数据库如何解决中文乱码问题?方法有哪些?

    很多使用数据库的人都知道,在安装SQLServer数据库是,如果设置不当就会出现一些中文乱码.主要原因是,很多人在使用默认安装系统时,一般不会考虑到默认排序的规则是拉丁文的排序规则,只是点击下一步,在 ...

  3. php utf-8读取,PHP读取文件,解决中文乱码UTF-8的方法分析

    PHP读取文件,解决中文乱码UTF-8的方法分析,方法,中文,操作技巧,文本,本文 PHP读取文件,解决中文乱码UTF-8的方法分析 易采站长站,站长之家为您整理了PHP读取文件,解决中文乱码UTF- ...

  4. java txt中文乱码,JAVA读取TXT文件 可解决中文乱码问题

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...

  5. AJAX解决中文乱码问题

    一.解决中文乱码问题的方法1:页面端发出的数据作一次encodeURI,如:encodeURI($("#userName").val()                       ...

  6. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别 参考文章: (1)java ...

  7. js获取url地址栏参数的方法,解决中文乱码问题,能支持中文参数

    js获取url地址栏参数的方法,解决中文乱码问题,能支持中文参数 参考文章: (1)js获取url地址栏参数的方法,解决中文乱码问题,能支持中文参数 (2)https://www.cnblogs.co ...

  8. [转]QT中QString与string的转化,解决中文乱码问题

    [转]QT中QString与string的转化,解决中文乱码问题 参考文章: (1)[转]QT中QString与string的转化,解决中文乱码问题 (2)https://www.cnblogs.co ...

  9. php如何解决中文乱码问题?

    php如何解决中文乱码问题? 参考文章: (1)php如何解决中文乱码问题? (2)https://www.cnblogs.com/wszz/p/7978610.html (3)https://www ...

  10. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0......

    原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...

最新文章

  1. MonoRec:无需激光雷达,只需单个相机就可以实现三维场景的稠密重建
  2. 写论文前先交提纲,没准儿提前就被顶刊接收!Nature:论文还没写,就知道是好研究...
  3. 《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
  4. How to save your Ethereum Dapp users from paying gas for transactions
  5. swift:打造你自己的折线图
  6. 用python可以处理xml文件怎么打开_Python大神都是这样处理xml文件的!
  7. python将txt文件转为excel格式以及写入excel超过65536行报错问题解决方法
  8. 【…感激2008,部署我的2009…】
  9. jmeter 添加虚拟IP
  10. php中ci框架分页,Codeigniter(CI)框架分页函数及相关知识
  11. Qt_QTableWidget用法 添加、删除、添加控件、获取控件在表格中位置
  12. vue下载导出Excel案例
  13. 【Proteus仿真】51单片机+红外测距仪(GP2D12)+ADC0809模数转换
  14. 【Python技巧】字典
  15. java中赛场统分的情况
  16. 一文看尽 6篇 CVPR2021 伪装目标检测、旋转目标检测论文
  17. 基于springboot+vue的水果销售系统附代码
  18. (转)任正非对新员工的寄语:烧不死的就是凤凰
  19. C语言中如何输出字符的编码,GB2312中汉字字符的编码在C语言中的输出测试
  20. Python 修改AD账号密码(三)- 简易网页版

热门文章

  1. 云场景实践研究第34期:加和科技
  2. set uid,set gid,sticky bit的三个权限的详细说明
  3. 选项卡 都是显示在页面底部
  4. java的内部类和匿名类剖析
  5. PWA(Progressive Web App)入门系列:消息通讯
  6. AWS推出深度学习容器,简化AI程序开发
  7. js实现数据结构及算法之二叉树(Binary Tree)
  8. 正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能
  9. 人工智能系列精品课学习笔记-2如何提问以获得更多更好的帮助
  10. 高可用集群技术之RHCS应用详解(一)