现象:SpringMVC返回的结果中文乱码,返回的编码是ISO-8859-1
原因:spring MVC有一系列HttpMessageConverter去处理@ResponseBody注解的返回值,如返回list或其它则使用 MappingJacksonHttpMessageConverter,如果是string,则使用 StringHttpMessageConverter,而StringHttpMessageConverter使用的是字符集默认是ISO-8859-1,而且是final的。所以在当返回json中有中文时会出现乱码。源码如下
* @author Arjen Poutsma
* @author Juergen Hoeller
* @since 3.0
*/
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
/**
* The default charset used by the converter.
*/
public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
解决方法一:单个请求的@ResponseBody后面加上produces=“text/html;charset=UTF-8;”(此方法只针对单个调用方法起作用),如下
@GetMapping(value = "/hello", produces="text/html;charset=UTF-8;")
public String hello() {
return "hello, world测试";
}
中文显示正常了,可以看到返回的编码为UTF-8了
解决方法二:在配置文件中的<mvc:annotation-driven>
中添加以下代码
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 解决@ResponseBody返回中文乱码 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>*/*;charset=UTF-8</value>
</list>
</property>
<!-- 用于避免响应头过大 -->
<property name="writeAcceptCharset" value="false" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
中文显示正常了,可以看到返回的编码为UTF-8了
解决方法二:在配置文件中的<mvc:annotation-driven>
中使用MappingJackson2HttpMessageConverter转换字符串,如下
<mvc:annotation-driven>
<!-- 返回json数据,@response使用 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
这种方式返回的字符串会有双引号,如下