Spring MVC接收JSON数据的完整指南**
在现代Web开发中,JSON(JavaScript Object Notation)因其轻量级、易读和易于解析的特性,已成为前后端数据交换的主流格式之一,Spring MVC作为Java EE领域最流行的Web框架之一,提供了强大的支持来接收和处理JSON数据,本文将详细介绍Spring MVC如何接收JSON数据,包括环境准备、常用注解、代码示例以及常见问题的解决方案。
环境准备:添加JSON处理依赖
要让Spring MVC能够接收和处理JSON数据,首先需要在项目中引入JSON处理的库,目前最常用的是 Jackson,它是Spring Boot默认集成的JSON处理器,如果你使用的是传统的Spring MVC项目,需要手动添加以下依赖(以Maven为例):
<!-- Jackson 核心依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新稳定版本 -->
</dependency>
<!-- Jackson 注解支持(可选,但常用) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.15.2</version>
</dependency>
<!-- Jackson 核心功能(可选) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.15.2</version>
</dependency>
如果你使用的是 Spring Boot,通常只需要添加 spring-boot-starter-web 依赖,它会自动包含Jackson依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置Spring MVC支持JSON
在Spring MVC中,默认情况下已经配置了消息转换器(MessageConverter)来处理JSON请求和响应,关键在于 HttpMessageConverter 接口的实现类 MappingJackson2HttpMessageConverter,它负责将JSON请求体转换为Java对象,或将Java对象序列化为JSON响应体。
在传统Spring MVC项目中:
通常在Spring配置文件(如 dispatcher-servlet.xml)中,<mvc:annotation-driven/> 标签会自动注册 MappingJackson2HttpMessageConverter,所以一般情况下无需额外配置。
<mvc:annotation-driven/>
在Spring Boot项目中:
Spring Boot通过 @EnableWebMvc 注解(通常与 @Configuration 一起使用)或者自动配置机制,会自动注册好 MappingJackson2HttpMessageConverter,开发者无需手动配置。
接收JSON数据的核心注解
Spring MVC提供了几个关键的注解来帮助我们接收JSON数据,其中最核心的是 @RequestBody。
@RequestBody 注解
@RequestBody 注解用于将HTTP请求体中的内容绑定到方法参数上,Spring MVC会使用配置好的 HttpMessageConverter(如 MappingJackson2HttpMessageConverter)将请求体的JSON字符串自动转换为Java对象。
使用场景:
当客户端发送POST或PUT请求,并将数据以JSON格式放在请求体(request body)中时,可以使用 @RequestBody 来接收。
示例代码:
假设我们有以下JSON数据:
{
"username": "zhangsan",
"age": 25,
"email": "zhangsan@example.com"
}
对应的Java实体类(POJO):
public class User {
private String username;
private Integer age;
private String email;
// 无参构造器、getter和setter方法
// 省略...
}
Controller方法接收JSON数据:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@PostMapping("/user")
@ResponseBody // 如果直接返回对象,且配置了消息转换器,可以自动转为JSON响应
public String addUser(@RequestBody User user) {
System.out.println("接收到用户信息:" + user);
// 处理user对象...
return "用户添加成功:" + user.getUsername();
}
}
说明:
@PostMapping("/user"):表示处理POST请求,路径为/user。@RequestBody User user:将请求体中的JSON数据转换为User对象并注入到user参数中。@ResponseBody:表示方法的返回值直接作为HTTP响应体返回(通常是JSON格式,因为MappingJackson2HttpMessageConverter会处理),如果Controller类上添加了@RestController注解,则方法上的@ResponseBody可以省略,因为@RestController已经包含了@ResponseBody的功能。
@RestController 注解
@RestController 是 @Controller 和 @ResponseBody 的组合注解,如果Controller类的所有方法都返回JSON、XML或其他自定义的响应体内容,而不是返回视图名称,那么使用 @RestController 会更加方便。
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/user")
public String addUser(@RequestBody User user) { // 这里无需 @ResponseBody
System.out.println("接收到用户信息:" + user);
return "用户添加成功:" + user.getUsername();
}
}
JSON字段与Java字段映射
当JSON字段名与Java对象属性名不一致时,可以使用Jackson提供的注解进行映射:
@JsonProperty("json字段名"):指定JSON字段名与Java属性的映射关系。@JsonIgnore:忽略该属性,不参与序列化和反序列化。@JsonIgnoreProperties(ignoreUnknown = true):用在类上,忽略JSON中存在但Java对象中不存在的属性。
示例:
public class User {
@JsonProperty("user_name")
private String username;
private Integer age;
@JsonIgnore
private String password; // 忽略password字段
// getter和setter...
}
对应的JSON:
{
"user_name": "lisi",
"age": 30,
"password": "123456" // 这个字段会被忽略
}
接收JSON数组或List
如果客户端发送的是一个JSON数组,Spring MVC也可以将其转换为Java的List或数组。
JSON数组示例:
[
{"username": "wangwu", "age": 28},
{"username": "zhaoliu", "age": 32}
]
Controller接收方式:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@PostMapping("/users")
public String addUsers(@RequestBody List<User> users) {
for (User user : users) {
System.out.println("接收到用户:" + user);
}
return "成功添加 " + users.size() + " 个用户";
}
// 或者接收数组
@PostMapping("/userArray")
public String addUserArray(@RequestBody User[] userArray) {
// 类似处理
return "成功添加 " + userArray.length + " 个用户";
}
}
常见问题与解决方案
-
415 Unsupported Media Type错误- 原因:服务器无法根据请求头
Content-Type: application/json找到合适的消息转换器,可能是未配置Jackson依赖,或者未启用<mvc:annotation-driven/>。 - 解决:确保已添加Jackson依赖,并且Spring MVC配置正确。
- 原因:服务器无法根据请求头
-
400 Bad Request错误,提示JSON解析异常- 原因:请求体的JSON格式不正确,或者无法转换为目标Java对象(如字段类型不匹配、缺少必填字段等)。
- 解决:检查请求体JSON格式是否合法,确保Java对象的字段类型和JSON字段类型匹配,可以使用
@JsonIgnoreProperties(ignoreUnknown = true)来忽略多余字段。
-
Required request body is missing错误- 原因:使用了
@RequestBody注解,但请求体中没有内容或请求方法不正确(如GET请求通常没有请求体)。 - 解决:确保发送的是POST、PUT等带有请求体的HTTP方法,并且请求体中有有效的JSON数据。
- 原因:使用了
-
日期格式问题
- 原因:JSON中的日期字符串与Java
Date或LocalDate等日期类型的默认格式不匹配。 - 解决:可以使用Jackson的日期格式化注解,如
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")。
示例:
public class User { // ... @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8 - 原因:JSON中的日期字符串与Java



还没有评论,来说两句吧...