今天在对接第三方接口时,出现返回值乱码的问题,在网上查了下解决办法,都说:由于 RestTemplate 的默认构造方法初始化的 StringHttpMessageConverter 的默认字符集是 ISO-8859-1,所以导致 RestTemplate 请求的响应内容会出现中文乱码。
但是我查看日志发现,RestTemplate 默认是用 utf-16 解析 string 的,而不是 ISO-8859-1,跟网上其他人说的不符,很疑惑.
不过,不论是 utf-16 还是 ISO-8859-1,都不是返回值需要的 utf-8,所以,解决方法类似,都是要将默认编码设置为 utf-8
综合网上很多人的解决方案,此处归纳出我的解决方案:
获取 RestTemplate 的 MessageConverter 列表,然后删除 StringHttpMessageConverter;初始化字符集为 UTF-8 的 StringHttpMessageConverter,并将其添加到 RestTemplate 的 MessageConverter 列表中.
由于 spring 是将 StringHttpMessageConverter 放到 RestTemplate.messageConverters 的第二个位置;
若直接使用 add,则 StringHttpMessageConverter 是在最后一个位置;
我调用的 url 返回值类型为 string,
String res = restTemplate.postForObject(url, param, String.class);
在处理返回值的时候,RestTemplate 会 for 循环 messageConverters,依次去处理 String 类型的 response,如果 response 里面存在的 String 不是标准的 json、xml 等类型的时候就会异常;
因为我得到的 res 里面不是一个标准的 json;
所以我按照源码当中的处理方式,也将 StringHttpMessageConverter 放在 RestTemplate.messageConverters 的第二个位置.
代码如下:
public static void reInitMessageConverter(RestTemplate restTemplate) {
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
HttpMessageConverter<?> converterTarget = null;
for (HttpMessageConverter<?> item : converterList) {
if (item.getClass() == StringHttpMessageConverter.class) {
converterTarget = item;
break;
}
}
if (converterTarget != null) {
converterList.remove(converterTarget);
}
HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
converterList.add(1, converter);
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于