转载地址:https://blog.csdn.net/qq_15071263/article/details/82755280
目录
RestTemplate 包含中文时乱码
1、解决方法
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
return restTemplate;
}
2、产生原因
首先来看RestTemplate 默认构造方法【springboot 版本2.0.4.RELEASE】
public RestTemplate() {
this.messageConverters = new ArrayList();
this.errorHandler = new DefaultResponseErrorHandler();
this.uriTemplateHandler = new DefaultUriBuilderFactory();
this.headersExtractor = new RestTemplate.HeadersExtractor();
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());
}
}
可以看到默认加载了很多的消息转换器,因为中文是 String 类型的,所以我们看StringHttpMessageConverter
先看构造方法
public StringHttpMessageConverter() {
this(DEFAULT_CHARSET);
}
然后看 DEFAULT_CHARSET
public static final Charset DEFAULT_CHARSET;
并没有给初始值,那么去找初始化代码
static {
DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
}
StringHttpMessageConverter 的默认编码格式是 ISO_8859_1,我们需要改为 UTF - 8
找到能设置默认编码的 构造方法,并替换默认转换器,参考上面的解决方法
public StringHttpMessageConverter(Charset defaultCharset) {
super(defaultCharset, new MediaType[]{MediaType.TEXT_PLAIN, MediaType.ALL});
this.writeAcceptCharset = true;
}