处理restTemplate的messageConverters设置StringHttpMessageConverter

背景:

   调用第三方接口,返回中文是乱码

解决方案:

   

private void setUtf8(RestTemplate restTemplate) {
        List> 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> messageConverters = new ArrayList>();

是类全局变量,在高并发情况下,去修改messageConverters,会造成NPE异常。

解决方案:

把RestTemplate的配置类修改convert

/**
     * 设置StringHttpMessageConverter ->utf-8
     * @param restTemplate
     */
    private void setUtf8(RestTemplate restTemplate) {
        List> 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);
            }
        }
    }

初始化一次,以后就不初始化,完美解决

你可能感兴趣的:(java)