RestTemplate中文乱码完美解决方案


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

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { //省略其他代码 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<HttpMessageConverter<?>> 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对象即可。

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM