解决SpringMVC返回字符串乱码问题

现象:SpringMVC返回的结果中文乱码,返回的编码是ISO-8859-1

解决SpringMVC返回字符串乱码问题_第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了
解决SpringMVC返回字符串乱码问题_第2张图片

解决方法二:在配置文件中的中添加以下代码

<mvc:annotation-driven>
    <mvc:message-converters>
    	
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8value>
                    <value>application/json;charset=UTF-8value>
                    <value>*/*;charset=UTF-8value>
                list>
            property>
              
			<property name="writeAcceptCharset" value="false" /> 
        bean>
    mvc:message-converters>
mvc:annotation-driven>

中文显示正常了,可以看到返回的编码为UTF-8了
解决SpringMVC返回字符串乱码问题_第3张图片

解决方法二:在配置文件中的中使用MappingJackson2HttpMessageConverter转换字符串,如下

<mvc:annotation-driven>
    
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8value>
                    <value>application/json;charset=UTF-8value>
                list>
            property>
        bean>
    mvc:message-converters>
mvc:annotation-driven>

这种方式返回的字符串会有双引号,如下
解决SpringMVC返回字符串乱码问题_第4张图片

你可能感兴趣的:(spring)