资讯专栏INFORMATION COLUMN

RestTemplate中文乱码完美解决方案

Eastboat / 1912人阅读

摘要:中对字符串使用的是中默认的编码省略其他代码编码格下,中文是乱码的。因此我们需要将编码格式设置为的格式才能支持中文。以上方式自己亲测可用,如果使用了上述方式还是乱码的话,可以排查下是不是后端没有设置编码格式

RestTemplate中对字符串使用的是StringHttpMessageConverter中默认的编码

public class StringHttpMessageConverter extends AbstractHttpMessageConverter {
    //省略其他代码
    public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
}

ISO_8859_1编码格下,中文是乱码的。因此我们需要将编码格式设置为UTF-8的格式才能支持中文。
网络上大部分的教程都是通过以下方式来修改编码格式

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));

原因是在RestTemplate的构造函数中,对messageConverters赋值时,在下标为1的位置设置的是StringHttpMessageConverter对象。

public class RestTemplate extends InterceptingHttpAccessor implements RestOperations {
    public RestTemplate() {
        this.messageConverters.add(new ByteArrayHttpMessageConverter());
        this.messageConverters.add(new StringHttpMessageConverter());//此处设置
        this.messageConverters.add(new ResourceHttpMessageConverter(false));
        //省略其他代码
    }
}

但是这种写死下标的方式是极为不推荐的,因为不排除Spring在后续版本中因为引入了其他转换器而导致下标变化的问题。推荐使用以下方式。

public static void setRestTemplateEncode(RestTemplate restTemplate) {
    if (null == restTemplate || ObjectUtils.isEmpty(restTemplate.getMessageConverters())) {
        return;
    }

    List> messageConverters = restTemplate.getMessageConverters();
    for (int i = 0; i < messageConverters.size(); i++) {
        HttpMessageConverter httpMessageConverter = messageConverters.get(i);
        if (httpMessageConverter.getClass().equals(StringHttpMessageConverter.class)) {
            messageConverters.set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        }
    }
}

我们新增一个方法,将RestTemplate对象传递进去,内部遍历messageConverters,找到StringHttpMessageConverter并替换为UTF-8格式的StringHttpMessageConverter对象即可。

以上方式自己亲测可用,如果使用了上述方式还是乱码的话,可以排查下是不是后端没有设置编码格式

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75771.html

相关文章

  • 如何解决SSM框架前台传参数到后台乱码的问题

    最近在做一个SSM框架的项目,总是遇到一个问题,就是后台接收前端传递的中文参数的时候,参数是乱码的,导致sql语句经常无法执行,但是有很奇怪,在测试环境和生产环境都是正常的,就是本地开发环境总是这么坑人,那如何解决呢?1、比较累人,就是能不传中文就不传中文参数,对于这点,大家就笑笑而过就行了。。。。 2、还是挺累人,真的得传中文,那就将中文强制转码了,如下: 中文.getBytes(UTF-8);...

    niuxiaowei111 评论0 收藏0
  • 解决Phalcon与Mysql连接出现中文乱码

    摘要:找到文件夹下的文件添加到数据库连接处案例完美解决乱码 1.找到文件夹下的 app/config/service.php 文件 2.添加 ‘charset’ => ‘utf8’ 到数据库连接处 案例: $di->set(‘db’, function() use ($config) { return new DbAdapter(array( ‘host’ => ...

    garfileo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<