Controller 返回 json那些小事
快速解决
想要将对象转换为json我们需要先在maven中导入一些包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
修改spring-mvc配置文件增加 【第二行】 和 【倒数一二行】
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
在spring-mvc配置文件中添加
<mvc:annotation-driven/>
使用直接返回对象即可
@RequestMapping(value = "/quick2")
@ResponseBody
public User save2() throws JsonProcessingException {
User user = new User();
user.setName("探索星空");
user.setAge(12);
return user;
}
下面是我的学习过程
想要将对象转换为json我们需要先在maven中导入一些包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
我们测试一下
@RequestMapping(value = "/quick3")
@ResponseBody
public String save3() throws JsonProcessingException {
User user = new User();
user.setName("探索星空");
user.setAge(12);
ObjectMapper o = new ObjectMapper();
String s = o.writeValueAsString(user);
return String;
}
运行结果出现了http 500错误
我又在纯Java中测试了一下
class Solution {
public static void main(String[] args) throws JsonProcessingException {
User user = new User();
user.setName("探索星空");
user.setAge(12);
ObjectMapper o = new ObjectMapper();
String s = o.writeValueAsString(user);
System.out.println(s);
}
}
output: {"name":"探索星空","age":12}
一切正常,我又仔细看了下之前报错的信息......
Handler dispatch failed(处理程序调度失败);一般出现这个提示,就是说明有包没有导入。
看了下WEB-INF/lib下的包果然没有。
果断点击file->project structure->artifacts 。put需要的包
再次运行又发现一个新的问题-字符乱码:
还好这个问题比较简单,我们在spring-mvc的配置文件中加入
<!-- 用于使用@ResponseBody后返回中文避免乱码 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean id="stringHttpMessageConverter"
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="writeAcceptCharset" value="false" />
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
问题顺利解决:
优化配置
每次都要这样恐怕太麻烦了
ObjectMapper o = new ObjectMapper();
String s = o.writeValueAsString(user);
我们可以在spring-mvc的配置文件中加入
<!-- 处理json-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
这样处理后,只要在Controller中返回需要转化的对象会可以了
@RequestMapping(value = "/quick2")
@ResponseBody
public User save2() throws JsonProcessingException {
User user = new User();
user.setName("探索星空");
user.setAge(12);
return user;
}
结果:
值得一提的是,这种方法配置的程序会自动加入utf-8头字段声明,我们删去之前处理乱码的代码
结果:
大功告成。