如下代码,返回中文乱码
@RequestMapping("/getAddress")
@ResponseBody
public String getAddress(){
return "北京市"; // 页面显示???
}
解决办法:
设置自带的StringHttpMessageConverter编码为UTF-8(默认是ISO_8859_1)
@Configuration
public class MyConfiguration extends WebMvcConfigurationSupport {
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// 解决controller返回字符串中文乱码问题
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter)converter).setDefaultCharset(StandardCharsets.UTF_8);
}
}
}
}
注意:不能用以下方式
// !!!不能用这种方式,如果用了将不会添加其他的converter
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
}
查看org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#getMessageConverters
方法可以看到
protected final List<HttpMessageConverter<?>> getMessageConverters() {
if (this.messageConverters == null) {
this.messageConverters = new ArrayList<>();
configureMessageConverters(this.messageConverters);
// 如重写configureMessageConverters,list不为空,导致不会添加一些默认的converter
if (this.messageConverters.isEmpty()) {
// 添加其它默认的converter
addDefaultHttpMessageConverters(this.messageConverters);
}
// 正确解法应该重写这个方法
extendMessageConverters(this.messageConverters);
}
return this.messageConverters;
}