SpringBoot 如何使用 @RequestBody 进行数据校验
在 Web 开发中,前台向后台发送数据是非常常见的场景。而在 SpringBoot 框架中,我们通常使用 @RequestBody 注解来接收前台发送的 JSON 数据,并将其转化为 Java 对象。但是,接收到的数据并不一定是符合要求的,因此我们需要对其进行数据校验。本文将介绍如何在 SpringBoot 中使用 @RequestBody 进行数据校验。
什么是 @RequestBody
@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 Java 对象。它的作用是将 HTTP 请求正文中的 JSON 字符串绑定到相应的 Java 对象上。在 SpringBoot 中,我们通常使用 @RequestBody 注解来接收前台发送的 JSON 数据,并将其转化为 Java 对象。
如何使用 @RequestBody 进行数据校验
在 SpringBoot 中,我们可以使用 JSR-303 规范提供的注解来对 Java 对象进行数据校验。JSR-303 是 Java EE 6 中引入的 Bean Validation 规范,它提供了一套用于数据校验的注解。
在 SpringBoot 中使用 JSR-303 注解进行数据校验的步骤如下:
- 引入相关依赖
在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 在 Java Bean 中添加校验注解
在 Java Bean 中添加校验注解,例如:
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@NotNull(message = "密码不能为空")
@Size(min = 6, message = "密码长度不能小于 6 位")
private String password;
// 省略 getter 和 setter 方法
}
- 在 Controller 方法中添加 @Validated 和 @RequestBody 注解
在 Controller 方法中添加 @Validated 和 @RequestBody 注解,例如:
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/add")
public Result addUser(@Validated @RequestBody User user) {
// 处理添加用户的逻辑
}
}
在上述代码中,@Validated 注解用于启用数据校验,@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 User 对象。
- 处理校验结果
如果数据校验失败,会抛出 MethodArgumentNotValidException 异常。我们可以在 ControllerAdvice 中捕获此异常,并返回校验结果。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidationException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<ObjectError> allErrors = bindingResult.getAllErrors();
List<String> errorMessages = new ArrayList<>();
for (ObjectError error : allErrors) {
errorMessages.add(error.getDefaultMessage());
}
return Result.error(String.join(",", errorMessages));
}
}
在上述代码中,我们使用 @RestControllerAdvice 注解声明一个全局异常处理类,其中 @ExceptionHandler 注解用于捕获 MethodArgumentNotValidException 异常,并处理校验结果,最终返回一个 Result 对象。
完整代码示例
@Data
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@NotNull(message = "密码不能为空")
@Size(min = 6, message = "密码长度不能小于 6 位")
private String password;
}
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/add")
public Result addUser(@Validated @RequestBody User user) {
// 处理添加用户的逻辑
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidationException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<ObjectError> allErrors = bindingResult.getAllErrors();
List<String> errorMessages = new ArrayList<>();
for (ObjectError error : allErrors) {
errorMessages.add(error.getDefaultMessage());
}
return Result.error以上示例代码可能有些不完整,我们来完整展示一下如何使用 @RequestBody 进行数据校验的完整代码示例。
### 引入依赖
在 pom.xml 文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
编写实体类
@Data
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@NotNull(message = "密码不能为空")
@Size(min = 6, message = "密码长度不能小于 6 位")
private String password;
}
编写 Controller
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/add")
public Result addUser(@Validated @RequestBody User user) {
// 处理添加用户的逻辑
}
}
在上述代码中,@Validated 注解用于启用数据校验,@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 User 对象。
编写全局异常处理类
如果数据校验失败,会抛出 MethodArgumentNotValidException 异常。我们可以在 ControllerAdvice 中捕获此异常,并返回校验结果。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidationException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<ObjectError> allErrors = bindingResult.getAllErrors();
List<String> errorMessages = new ArrayList<>();
for (ObjectError error : allErrors) {
errorMessages.add(error.getDefaultMessage());
}
return Result.error(String.join(",", errorMessages));
}
}
在上述代码中,我们使用 @RestControllerAdvice 注解声明一个全局异常处理类,其中 @ExceptionHandler 注解用于捕获 MethodArgumentNotValidException 异常,并处理校验结果,最终返回一个 Result 对象。
编写启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void addUserTest() {
User user = new User();
user.setUsername("test");
user.setPassword("12345");
ResponseEntity<Result> responseEntity = restTemplate.postForEntity("/user/add", user, Result.class);
Assert.assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
Result result = responseEntity.getBody();
Assert.assertEquals(ResultStatus.FAIL.getCode(), result.getStatus());
Assert.assertEquals("密码长度不能小于 6 位", result.getMessage());
}
}
在上述代码中,我们使用 SpringBoot 自带的 TestRestTemplate 对象来模拟发送 POST 请求,并验证数据校验的结果是否符合预期。
总结
在 SpringBoot 中使用 @RequestBody 进行数据校验,可以有效地提高代码的健壮性和可靠性。通过 JSR-303 提供的注解,我们可以轻松地对 Java 对象进行数据校验,并在数据校验失败时返回相应的错误信息。希望本文能够对大家在 SpringBoot 中使用 @RequestBody 进行数据校验有所帮助。