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

现象: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>

这种方式返回的字符串会有双引号,如下
在这里插入图片描述

发布了115 篇原创文章 · 获赞 36 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章