SpringBoot 如何使用 @RequestBody 进行数据校验

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 注解进行数据校验的步骤如下:

  1. 引入相关依赖

在 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  1. 在 Java Bean 中添加校验注解

在 Java Bean 中添加校验注解,例如:

public class User {@NotNull(message = "用户名不能为空")private String username;@NotNull(message = "密码不能为空")@Size(min = 6, message = "密码长度不能小于 6 位")private String password;// 省略 getter 和 setter 方法
}
  1. 在 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 对象。

  1. 处理校验结果

如果数据校验失败,会抛出 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 {@Autowiredprivate TestRestTemplate restTemplate;@Testpublic 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 进行数据校验有所帮助。

本文链接:https://my.lmcjl.com/post/9203.html

展开阅读全文

4 评论

留下您的评论.