最近开发的一个web项目,返回json数据的时候出现了乱码问题。
代码如下:
@RequestMapping(path = "/abcdef",method={RequestMethod.GET,RequestMethod.POST}) 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数据写到“流”中即可。对于解决问题而言,往往原始的方法是最有效的方式。
|
注意:最后前端提交的数据,get请求对于配置的编码过滤器是不好使的,所以应该把tomcat的编码也配置下,要不然会出现乱码的问题。