300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > RestTemplate调用请求中文乱码解决办法

RestTemplate调用请求中文乱码解决办法

时间:2019-02-03 02:57:00

相关推荐

RestTemplate调用请求中文乱码解决办法

RestTemplate调用请求中文乱码解决办法

一、出现问题的原因二、解决办法

一、出现问题的原因

RestTemplate在请求调用过程中,利用的HttpMessageConverter类来进行报文转换,以下是部分源码

而我们在HttpMessageConventer接口的抽象类AbstractHttpMessageConverter中发现有defaultCharset的字段,并存在set方法

/*** Set the default character set, if any. * @since 4.3*/public void setDefaultCharset(@Nullable Charset defaultCharset) {this.defaultCharset = defaultCharset;}

而我们最常用的就属StringHttpMessageConverter,该Converter默认的字符集是ISO8859-1, 所以在包含中文请求时会出现乱码问题

因此我们只需要更改默认字符集即可

二、解决办法

在项目中注入RestTemplate的地方获取到要修改的转换器,并设置中文字符集即可,如

@Bean("restTemplate")@ConditionalOnMissingBean(RestTemplate.class)public RestTemplate restTemplateHasNoLoadBalanced() {return createRestTemplate();}private RestTemplate createRestTemplate() {RestTemplate restTemplate = new RestTemplateBuilder().requestFactory(OkHttp3ClientHttpRequestFactory.class).setConnectTimeout(Duration.ofSeconds(5)).setReadTimeout(Duration.ofSeconds(30)).build();List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();Iterator<HttpMessageConverter<?>> iterator = converters.iterator();while (iterator.hasNext()) {HttpMessageConverter<?> converter = iterator.next();if (converter instanceof MappingJackson2XmlHttpMessageConverter){// 删除xml序列化,内部微服务之间用json交互iterator.remove();}else if (converter instanceof StringHttpMessageConverter){// 解决使用restTemplate中文乱码的问题((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);}}return restTemplate;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。