springmvc乱码问题

最近开发的一个web项目,返回json数据的时候出现了乱码问题。

代码如下:

@RequestMapping(path = "/abcdef",method={RequestMethod.GET,RequestMethod.POST})
@ResponseBody

public String getData(){

        return ...;

}

            于是我查看了数据库编码,springmvc配置的过滤器的编码,tomcat的编码问题,都是统一的采用编码方式UTF-8,而且我确定在服务器返回之前,数据是没有乱码的,但是为什么返回的数据,前端的js获取的时候就乱码呢?filter已经设置了编码啊,tomcat也是这样的编码啊。最后在网上找到下面的这篇博客,就知道原因了  https://my.oschina.net/heiseguoguo/blog/1545155。

 

<mvc:annotation-driven>
    <mvc:message-converters>
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <!--  @since 4.3 -->
        <!-- <property name="defaultCharset" value="UTF-8"></property>-->
        <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>    
    </bean>
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <!--  @since 4.3 -->
        <!-- <property name="defaultCharset" value="UTF-8"></property> -->
        <property name="supportedMediaTypes">
        <list>
            <value>application/json;charset=UTF-8</value>
        </list>
        </property>
    </bean>        
    </mvc:message-converters>
</mvc:annotation-driven>

 

在服务器上启动web,报错:

SEVERE: Servlet.service() for servlet springDispatcherServlet threw exception
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectWriter.forType(Lcom/fasterxml/jackson/databind/JavaType;)Lcom/fasterxml/jackson/databind/ObjectWriter;

 

由于上面配置的MappingJackson2HttpMessageConverter是JackSon的类应该配置相关的包:

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-core</artifactId>
   <version>2.1.0</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.1.0</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-annotations</artifactId>
   <version>2.1.0</version>
</dependency>

还是报错如上,去网上查看可能引入的包的版本太低导致。

参考:http://www.sojson.com/blog/145.html

<!-- Spring 升级4+ 依赖的JSON包 -->
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.7.4</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-core</artifactId>
   <version>2.7.4</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-annotations</artifactId>
   <version>2.7.4</version>
</dependency>
<!-- /Spring 升级4+ 依赖的JSON包 -->

 

        但是还有一种方式去解决我遇到的问题,就是采用最原始的方法,因为向前端返回数据,前端后交互都是通过“流”的形式交互的,我们只要把json数据写到“流”中即可。对于解决问题而言,往往原始的方法是最有效的方式。

@RequestMapping(path = "/abcdef",method={RequestMethod.GET,RequestMethod.POST})
@ResponseBody

public String getData(HttpServletResponse response){

        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

      try {
           response.getWriter().write(...);
           response.getWriter().flush();
     } catch (IOException e) {
          e.printStackTrace();
     }

        return null;

}

 

 

注意:最后前端提交的数据,get请求对于配置的编码过滤器是不好使的,所以应该把tomcat的编码也配置下,要不然会出现乱码的问题。

 

转载于:https://my.oschina.net/u/3648248/blog/1554363

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值