• SpringMVC 使用@ResponseBody返回json 中文乱码与返回实体类报错


       有时候我们发现接收的是中文,返回却是个?。这确实是个蛋疼的问题,Spring中解析字符串的转换器默认编码居然是ISO-8859-1

    /**
     * Implementation of {@link HttpMessageConverter} that can read and write strings.
     *
     * <p>By default, this converter supports all media types ({@code &#42;&#47;&#42;}),
     * and writes with a {@code Content-Type} of {@code text/plain}. This can be overridden
     * by setting the {@link #setSupportedMediaTypes supportedMediaTypes} property.
     *
     * @author Arjen Poutsma
     * @since 3.0
     */
    public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
    
        public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

    既然找到问题了,那就必须想办法改过来,不同版本的Spring好像方法还不一样,网上不少说的都是Spring3.*的,现在Spring4早都出来了

    更改方式可以参考

    http://stackoverflow.com/questions/3616359/who-sets-response-content-type-in-spring-mvc-responsebody

    http://www.cnblogs.com/chenying99/archive/2012/04/17/2453017.html

    我现在用的Spring4.2.5,上面说的几个方法都试了,最后发现只有这两个可以

    方法一,使用(produces = "application/json; charset=utf-8"):

        @RequestMapping(value="/getUsersByPage",produces = "application/json; charset=utf-8")
    //    @RequestMapping("/getUsersByPage")
        @ResponseBody
        public String getUsersByPage(String page,String rows,String text,HttpServletRequest request,HttpServletResponse response){

    方法二,在spring-mvc.xml中添加:(推荐这种)

        <!-- 设定消息转换的编码为utf-8防止controller返回中文乱码 -->
        <bean
            class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <bean
                        class="org.springframework.http.converter.StringHttpMessageConverter">
                        <property name="supportedMediaTypes">
                            <list>
                                <value>text/html;charset=UTF-8</value>
                            </list>
                        </property>
                    </bean>
                </list>
            </property>
        </bean>

    以上两种方式经过验证都没有问题。注意,这种方法一定要将上面配置写在 <mvc:annotation-driven/> 前面,否则会不起作用。

    注意:上面的配置是不能将实体类以JSON形式放回的。需要:

     1.原因:这是因为springmvc默认是没有对象转换成json的转换器的,需要手动添加jackson依赖。

      2.解决步骤:

        手动添加jackson依赖到pom.xml文件中

     <properties>
        <jackson.version>2.5.4</jackson.version>
      </properties> 
    
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>${jackson.version}</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>${jackson.version}</version>
        </dependency>

      如果还是没有解决,则进行以下步骤

      在springmvc配置文件中进行如下配置

    <mvc:annotation-driven>
         <mvc:message-converters>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
       </mvc:message-converters>
    </mvc:annotation-driven>

    如果出现中文乱码,可以在构造函数传入参数:

                <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
                    <constructor-arg value="UTF-8" />  
                </bean>  

    或者:

                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>

    附两个完整的配置(二选一即可):(有了这个不用配置方法二中的配置)  注意:下面的配置需要放在<context:component-scan base-package="cn.xm.jwxt.controller" />扫描包的配置前面

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

    或者:

        <mvc:annotation-driven conversion-service="conversionServiceFactoryBean" >
            <mvc:message-converters>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8" />
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
  • 相关阅读:
    操作系统 实验一 命令解释程序的编写
    软件工程 《构建之法》1、2、3章读后感
    软件工程实验一 复利计算 第四次实验
    软件工程实验一 复利计算(第三次实验实验总结)
    软件工程实验一 复利计算
    实验0 了解和熟悉操作系统
    团队工作总结及自评 & 补上来的用户调研
    四则运算安卓版ver.mk2
    安卓版四则运算
    每日更新
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8722802.html
Copyright © 2020-2023  润新知