SpringBoot如何使用@RequestBody进行数据校验
作者:程序媛徐师姐
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 进行数据校验有所帮助。
以上就是SpringBoot 如何使用 @RequestBody 进行数据校验的详细内容,更多关于SpringBoot @RequestBody数据校验的资料请关注脚本之家其它相关文章!