下面是 @Validated 和 @Valid 的详细讲解和异常捕获处理方式攻略:
1. @Validated 和 @Valid 的区别
@Validated 和 @Valid 都是基于 JSR-303 的 Bean Validation 规范来进行数据校验的注解。
@Validated 注解是 Spring 提供的用于参数校验和值校验的注解。它可以让 Spring 在执行方法之前对参数进行校验,有助于减少冗余代码。
@Valid 注解是 Bean Validation 规范中的注解,用于标记需要进行数据校验的字段和方法参数,常用于表单数据验证等。
它们的使用方法不一样:
- @Valid:用于标注要校验的参数
- @Validated:用于标注参数的校验规则
因此,如果需要在程序中使用参数校验功能,需要同时引入 JSR-303 和 Spring Validation 依赖,然后在需要校验的地方使用注解进行标记。
2. @Validated 和 @Valid 的异常捕获处理方式
由于数据校验可能会存在不符合规范的情况,因此需要对校验异常进行捕获和处理。这里介绍三种常见的异常捕获处理方式:
2.1 使用 try-catch 捕获异常并处理
在需要进行校验的方法中使用 @Valid 或 @Validated 注解进行参数校验时,可以在方法内部使用 try-catch 代码块进行捕获异常和处理。
示例代码:
@PostMapping("/user")
@ResponseBody
public Result addUser(@RequestBody @Valid User user, BindingResult result) {
try {
if (result.hasErrors()) {
return Result.fail(result.getAllErrors().get(0).getDefaultMessage());
}
// 保存用户信息
userService.addUser(user);
return Result.success();
} catch (Exception e) {
return Result.fail("添加用户失败");
}
}
2.2 使用 @ExceptionHandler 注解处理异常
使用 @ExceptionHandler 注解处理异常可以统一处理所有控制器中的异常,无需在每个方法中都进行异常捕获和处理,提高了代码重用性和可维护性。
示例代码:
@Validated
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
return Result.fail(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
}
@ExceptionHandler(Exception.class)
public Result handleException(Exception e) {
return Result.fail(e.getMessage());
}
}
2.3 使用 @ControllerAdvice 注解进行全局异常处理
使用 @ControllerAdvice 注解可以统一处理所有控制器中的异常,并且可以自定义返回结果,包括状态码、错误信息等。
示例代码:
@Validated
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
return Result.fail(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
}
@ExceptionHandler(Exception.class)
@ResponseBody
public Result handleException(Exception e) {
return Result.fail(e.getMessage());
}
}
3. 总结
@Validated 和 @Valid 注解用于数据校验,在使用时需要引入 Bean Validation 和 Spring Validation 依赖。异常处理可以使用 try-catch 捕获、@ExceptionHandler 注解或者 @ControllerAdvice 注解进行全局处理,具体根据需求进行选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:@Validated和@Valid三种异常捕获处理方式 - Python技术站