背景:
调用第三方接口,返回中文是乱码
解决方案:
private void setUtf8(RestTemplate restTemplate) {
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
if (!CollectionUtils.isEmpty(converterList)) {
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(converter);
}
}
}
因为StringHttpMessageConverter的默认设置值是ISO-8859-1
/**
* A default constructor that uses {@code "ISO-8859-1"} as the default charset.
* @see #StringHttpMessageConverter(Charset)
*/
public StringHttpMessageConverter() {
this(DEFAULT_CHARSET);
}
so,修改成UTF-8
测试没有问题,上线。
导致问题
线上偶尔出现出现NPE异常,发布就是好的,然后过段时间有偶尔出现NPE异常。
原因:
由于
private final List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
是类全局变量,在高并发情况下,去修改messageConverters,会造成NPE异常。
解决方案:
把RestTemplate的配置类修改convert
/**
* 设置StringHttpMessageConverter ->utf-8
* @param restTemplate
*/
private void setUtf8(RestTemplate restTemplate) {
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
if (!CollectionUtils.isEmpty(converterList)) {
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(converter);
}
}
}
初始化一次,以后就不初始化,完美解决