处理restTemplate的messageConverters设置StringHttpMessageConverter

背景:

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

解决方案:

   

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);
            }
        }
    }

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

在使用 RestTemplate 发送请求时,可以通过设置请求头的方式来指定编码格式。具体的代码如下: ```java RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Accept-Charset", "UTF-8"); HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers); ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); String responseBody = responseEntity.getBody(); ``` 上述代码中,通过设置请求头的 "Accept-Charset" 参数来指定编码格式为 UTF-8。在使用 RestTemplate 发送请求时,也可以通过配置 RestTemplate 实例的 MessageConverters 来指定编码格式,具体的代码可以参考下面的示例: ```java RestTemplate restTemplate = new RestTemplate(); List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); List<MediaType> supportedMediaTypes = new ArrayList<>(); supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); converter.setSupportedMediaTypes(supportedMediaTypes); messageConverters.add(converter); restTemplate.setMessageConverters(messageConverters); ``` 在上述代码中,我们创建了一个 MappingJackson2HttpMessageConverter 实例,并设置了它支持的媒体类型为 APPLICATION_JSON_UTF8。然后将这个实例添加到了 RestTemplate 实例的 MessageConverters 中。这样,在发送请求时就会使用指定的编码格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值