SpringMVC 返回 JSON/XML 数据: @ResponseBody
与消息转换器
各位观众老爷,大家好!今天咱们来聊聊 SpringMVC 里返回 JSON 和 XML 数据的那些事儿。别担心,这玩意儿听起来高大上,其实就像你炒盘回锅肉一样简单,掌握了方法,谁都能做出色香味俱全的程序来。
1. @ResponseBody
:一句话搞定数据返回
首先,咱们来说说 @ResponseBody
这个注解。这哥们儿的功能极其简单粗暴,就是告诉 SpringMVC:“喂,别费劲巴拉地找什么视图了,直接把方法返回的数据写到 HTTP 响应体里就成!”
想象一下,你辛辛苦苦地写了一个方法,返回了一个 Java 对象,比如一个 User
对象,里面包含了用户的姓名、年龄、住址等等信息。如果不加 @ResponseBody
,SpringMVC 默认会认为你想返回一个视图,它会屁颠屁颠地去配置的视图解析器里找对应的 JSP、Thymeleaf 页面,然后把 User
对象里的数据塞进去,渲染成 HTML 返回给浏览器。
但如果你只想返回 JSON 数据呢?浏览器那边需要的是 { "name": "张三", "age": 30, "address": "北京市朝阳区" }
这样的字符串,而不是一个 HTML 页面。这时候,@ResponseBody
就派上大用场了。
@Controller
public class UserController {
@RequestMapping("/user")
@ResponseBody
public User getUser() {
User user = new User();
user.setName("张三");
user.setAge(30);
user.setAddress("北京市朝阳区");
return user;
}
}
就这么简单,在 getUser()
方法上加上 @ResponseBody
注解,SpringMVC 就会自动把 User
对象转换成 JSON 字符串,然后放到 HTTP 响应体里返回给浏览器。
敲黑板!注意几个要点:
@ResponseBody
可以用在方法上,也可以用在类上。如果用在类上,就表示这个 Controller 里的所有方法都默认加上了@ResponseBody
。@ResponseBody
配合@RequestMapping
使用,才能指定哪个 URL 对应这个方法。@ResponseBody
只是告诉 SpringMVC 如何处理返回值,它本身并不会进行数据转换。真正的数据转换,需要靠消息转换器(MessageConverter)来完成。
2. 消息转换器(MessageConverter):数据格式的翻译官
什么是消息转换器呢?你可以把它想象成一个翻译官,专门负责把 Java 对象和 HTTP 消息体之间的数据格式进行转换。比如,把 Java 对象转换成 JSON 字符串,或者把 XML 字符串转换成 Java 对象。
SpringMVC 内置了很多消息转换器,可以处理各种常见的数据格式,比如:
| 消息转换器 | 功能描述 |
| ——————————————– | ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————0
MappingJackson2HttpMessageConverter
: 用于处理 JSON 数据,也就是我们常用的,依赖 Jackson 框架。MappingJackson2XmlHttpMessageConverter
: 用于处理 XML 数据,依赖 Jackson ——————————————– XML 模块。StringHttpMessageConverter
: 用于处理字符串数据。ByteArrayHttpMessageConverter
: 用于处理字节数组数据。
等等等等,还有很多,就不一一列举了。
注意: 这些转换器默认情况下已经配置在 SpringMVC 的配置类中了,所以我们一般情况下不需要手动配置。
3. 如何玩转 JSON?
3.1 依赖引入
首先,要玩 JSON,你得确保项目里有 Jackson 的依赖。如果你用的是 Maven,就在 pom.xml
文件里加上:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version> <!-- 替换为你需要的版本 -->
</dependency>
3.2 返回 JSON 数据
就像咱们前面说的,在方法上加上 @ResponseBody
注解,SpringMVC 就会自动把返回值转换成 JSON 字符串。
@Controller
public class UserController {
@RequestMapping("/user")
@ResponseBody
public User getUser() {
User user = new User();
user.setName("张三");
user.setAge(30);
user.setAddress("北京市朝阳区");
return user;
}
// 返回 List 集合
@RequestMapping("/users")
@ResponseBody
public List<User> getUsers() {
List<User> users = new ArrayList<>();
User user1 = new User();
user1.setName("张三");
user1.setAge(30);
user1.setAddress("北京市朝阳区");
User user2 = new User();
user2.setName("李四");
user2.setAge(25);
user2.setAddress("上海市浦东新区");
users.add(user1);
users.add(user2);
return users;
}
// 返回 Map 集合
@RequestMapping("/userMap")
@ResponseBody
public Map<String, User> getUserMap() {
Map<String, User> userMap = new HashMap<>();
User user1 = new User();
user1.setName("张三");
user1.setAge(30);
user1.setAddress("北京市朝阳区");
User user2 = new User();
user2.setName("李四");
user2.setAge(25);
user2.setAddress("上海市浦东新区");
userMap.put("user1", user1);
userMap.put("user2", user2);
return userMap;
}
}
3.3 使用 @RestController
简化代码
如果你想偷懒,可以使用 @RestController
注解。这个注解相当于 @Controller
+ @ResponseBody
的组合,也就是说,加了这个注解的 Controller 里的所有方法,都会默认加上 @ResponseBody
。
@RestController
public class UserController {
@RequestMapping("/user")
public User getUser() {
User user = new User();
user.setName("张三");
user.setAge(30);
user.setAddress("北京市朝阳区");
return user;
}
}
3.4 自定义 JSON 序列化
有时候,你可能需要自定义 JSON 的序列化过程。比如,你想把日期格式化成 yyyy-MM-dd
的格式,或者你想忽略某些字段。
这时候,你可以使用 Jackson 提供的注解,比如:
@JsonFormat
: 用于格式化日期。@JsonIgnore
: 用于忽略字段。@JsonProperty
: 用于自定义字段名称。
public class User {
private String name;
private int age;
private String address;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@JsonIgnore
private String password;
@JsonProperty("nickName")
private String nickname;
// getter and setter
}
3.5 处理 JSON 请求
除了返回 JSON 数据,SpringMVC 还可以处理 JSON 请求。也就是说,你可以接收客户端发送的 JSON 数据,然后把它转换成 Java 对象。
要实现这个功能,你需要使用 @RequestBody
注解。这个注解告诉 SpringMVC:“喂,把 HTTP 请求体里的数据转换成 Java 对象!”
@RestController
public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.POST)
public User createUser(@RequestBody User user) {
// 处理用户创建逻辑
System.out.println("Received user: " + user);
return user;
}
}
客户端发送的 JSON 数据:
{
"name": "张三",
"age": 30,
"address": "北京市朝阳区"
}
4. 如何玩转 XML?
4.1 依赖引入
要玩 XML,你得确保项目里有 Jackson XML 模块的依赖。如果你用的是 Maven,就在 pom.xml
文件里加上:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.0</version> <!-- 替换为你需要的版本 -->
</dependency>
4.2 返回 XML 数据
和 JSON 类似,在方法上加上 @ResponseBody
注解,SpringMVC 就会自动把返回值转换成 XML 字符串。
@Controller
public class UserController {
@RequestMapping(value = "/user.xml", produces = "application/xml")
@ResponseBody
public User getUser() {
User user = new User();
user.setName("张三");
user.setAge(30);
user.setAddress("北京市朝阳区");
return user;
}
}
注意:
- 需要在
@RequestMapping
注解里指定produces = "application/xml"
,告诉 SpringMVC 返回的数据类型是 XML。 - 返回的 Java 对象必须是可序列化的,也就是说,它必须有一个无参构造函数,并且所有的字段都有 getter 和 setter 方法。
4.3 使用 @XmlRootElement
和 @XmlElement
注解
要让 Jackson XML 模块正确地把 Java 对象转换成 XML 字符串,你需要使用 @XmlRootElement
和 @XmlElement
注解。
@XmlRootElement
用于标注根元素。@XmlElement
用于标注子元素。
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
@XmlRootElement(name = "user")
public class User {
private String name;
private int age;
private String address;
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@XmlElement
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
4.4 处理 XML 请求
和 JSON 类似,SpringMVC 也可以处理 XML 请求。也就是说,你可以接收客户端发送的 XML 数据,然后把它转换成 Java 对象。
要实现这个功能,你需要使用 @RequestBody
注解。
@RestController
public class UserController {
@RequestMapping(value = "/user.xml", method = RequestMethod.POST, consumes = "application/xml")
public User createUser(@RequestBody User user) {
// 处理用户创建逻辑
System.out.println("Received user: " + user);
return user;
}
}
注意:
- 需要在
@RequestMapping
注解里指定consumes = "application/xml"
,告诉 SpringMVC 接收的数据类型是 XML。
客户端发送的 XML 数据:
<user>
<name>张三</name>
<age>30</age>
<address>北京市朝阳区</address>
</user>
5. 自定义消息转换器
如果 SpringMVC 内置的消息转换器不能满足你的需求,你可以自定义消息转换器。
要自定义消息转换器,你需要实现 HttpMessageConverter
接口,并重写以下方法:
canRead()
: 判断是否可以读取 HTTP 请求体里的数据。canWrite()
: 判断是否可以把 Java 对象写入 HTTP 响应体。read()
: 把 HTTP 请求体里的数据转换成 Java 对象。write()
: 把 Java 对象写入 HTTP 响应体。
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import java.io.IOException;
import java.util.List;
public class MyMessageConverter implements HttpMessageConverter<User> {
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
// 判断是否可以读取 User 对象
return clazz.equals(User.class);
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
// 判断是否可以写入 User 对象
return clazz.equals(User.class);
}
@Override
public List<MediaType> getSupportedMediaTypes() {
// 支持的 Media Type
return List.of(MediaType.APPLICATION_JSON);
}
@Override
public User read(Class<? extends User> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
// 把 HTTP 请求体里的数据转换成 User 对象
// 这里只是一个示例,实际情况需要根据数据格式进行解析
return new User();
}
@Override
public void write(User user, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 把 User 对象写入 HTTP 响应体
// 这里只是一个示例,实际情况需要根据数据格式进行序列化
String data = "{name:" + user.getName() + "}";
outputMessage.getBody().write(data.getBytes());
}
}
然后,你需要把自定义的消息转换器注册到 SpringMVC 里。可以在配置类中进行配置:
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MyMessageConverter());
}
}
敲黑板!注意几个要点:
extendMessageConverters
方法可以扩展 SpringMVC 默认的消息转换器列表。configureMessageConverters
方法可以替换 SpringMVC 默认的消息转换器列表。
6. 总结
总而言之,SpringMVC 返回 JSON/XML 数据,离不开 @ResponseBody
和消息转换器这两个好帮手。@ResponseBody
负责告诉 SpringMVC 如何处理返回值,消息转换器负责把 Java 对象和 HTTP 消息体之间的数据格式进行转换。
掌握了这些知识,你就可以轻松地在 SpringMVC 里玩转 JSON 和 XML 数据,打造出更加灵活和强大的 Web 应用。
希望这篇文章能够帮助你更好地理解 SpringMVC 的数据返回机制。如果你还有什么疑问,欢迎在评论区留言,我会尽力解答。
祝大家编程愉快!