resttemplate 返回中文乱码解决

2023年2月14日10:26:12
@Bean
	public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
		RestTemplate restTemplate = new RestTemplate(factory);
        List<HttpMessageConverter<?>>messageConverters = 
 restTemplate.getMessageConverters();
        Iterator<HttpMessageConverter<?>> iterator=messageConverters.iterator();
        while(iterator.hasNext()){
            HttpMessageConverter<?> converter=iterator.next();
            //原有的String是ISO-8859-1编码 去掉
            if(converter instanceof StringHttpMessageConverter){
                iterator.remove();
            }
            
        }
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("utf-8")));
		return restTemplate;
	}

我们来看下RestTemplate  构造方法的源码

/**
	 * Create a new instance of the {@link RestTemplate} using default settings.
	 * Default {@link HttpMessageConverter}s are initialized.
	 */
	public RestTemplate() {
		this.messageConverters.add(new ByteArrayHttpMessageConverter());
		this.messageConverters.add(new StringHttpMessageConverter());
		this.messageConverters.add(new ResourceHttpMessageConverter(false));
		this.messageConverters.add(new SourceHttpMessageConverter<>());
		this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());

		if (romePresent) {
			this.messageConverters.add(new AtomFeedHttpMessageConverter());
			this.messageConverters.add(new RssChannelHttpMessageConverter());
		}

		if (jackson2XmlPresent) {
			this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
		}
		else if (jaxb2Present) {
			this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
		}

		if (jackson2Present) {
			this.messageConverters.add(new MappingJackson2HttpMessageConverter());
		}
		else if (gsonPresent) {
			this.messageConverters.add(new GsonHttpMessageConverter());
		}
		else if (jsonbPresent) {
			this.messageConverters.add(new JsonbHttpMessageConverter());
		}

		if (jackson2SmilePresent) {
			this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter());
		}
		if (jackson2CborPresent) {
			this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());
		}
	}

初始化RestTemplate默认初始化了几个 MessageConverter ,不过StringHttpMessageConverter 默认使用的是ISO_8859_1编码,我们只需移除旧的,初始化新的UTF-8的StringHttpMessageConverter,设置进去就行。

 

 

同理,如果我们不需要使用默认的json转换器,想使用国产的FASTJSON,也可通过替换完成。下篇文章说明。

  • 作者:我的裤衩呢
  • 原文链接:https://blog.csdn.net/a469517790/article/details/88027328
    更新时间:2023年2月14日10:26:12 ,共 2012 字。