返回

一文彻底搞懂SpringBoot接口参数校验:@Validated、@Valid和全局异常捕获

后端

如何使用 SpringBoot 对接口参数进行校验?

1. 前言

在实际项目开发中,经常需要对接口参数进行校验,以确保数据的准确性和有效性。SpringBoot 提供了强大的参数校验机制,可以帮助我们轻松实现接口参数校验。

2. @Validated 和 @Valid

@Validated@Valid 是两个重要的参数校验注解。@Validated 用于标记需要进行参数校验的类或方法,@Valid 用于标记需要进行参数校验的字段。

示例:

@Validated
public class UserController {
    @PostMapping("/save")
    public User save(@Valid User user) {
        // ...
    }
}

public class User {
    @NotNull
    private String username;
    @Email
    private String email;
    @Size(min = 6, max = 12)
    private String password;
}

3. 全局异常捕获

为了统一处理参数校验异常,我们可以使用 SpringBoot 提供的全局异常捕获机制。

实现步骤:

  1. 创建一个异常处理器类,并实现 @ControllerAdvice@ExceptionHandler 注解。
  2. 在异常处理器类中,添加一个 @ExceptionHandler 方法,并指定要捕获的异常类型。
  3. @ExceptionHandler 方法中,对异常进行处理,并返回一个响应结果。

代码示例:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        // ...
    }

}

4. 代码示例

@PostMapping("/save")
public User save(@Valid User user) {
    // ...
}
public class User {
    @NotNull
    private String username;
    @Email
    private String email;
    @Size(min = 6, max = 12)
    private String password;
}
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        // ...
    }

}

5. 总结

通过使用 @Validated@Valid 和全局异常捕获,我们可以轻松实现 SpringBoot 接口参数校验。这种方式不仅可以提高代码的健壮性和可维护性,还可以减少代码的冗余和复杂性。

常见问题解答

  1. 为什么需要进行接口参数校验?

    • 为了确保数据的准确性和有效性,避免因无效数据导致系统错误或安全问题。
  2. @Validated 和 @Valid 的区别是什么?

    • @Validated 用于标记需要校验的类或方法,@Valid 用于标记需要校验的字段。
  3. 如何处理参数校验异常?

    • 可以使用全局异常捕获机制,统一处理所有参数校验异常,并返回相应的响应结果。
  4. 哪些注解可以用于参数校验?

    • SpringBoot 提供了丰富的参数校验注解,如 @NotNull@Email@Size 等。
  5. 参数校验是否影响性能?

    • 参数校验通常对性能影响较小,但随着校验规则的复杂度增加,性能开销也会有所增加。