返回

Spring Boot 303参数校验与全局异常处理实战

后端

一、前言

在 Spring Boot 中,参数校验和全局异常处理是两个非常重要的功能。参数校验可以确保传入 API 的参数符合要求,从而避免不必要的错误发生。全局异常处理可以统一处理所有未捕获的异常,并提供友好的错误信息。

二、参数校验

Spring Boot 提供了多种方式来进行参数校验,其中最常用的方式是使用 JSR303 参数校验注解。JSR303 是一个用于 Java Bean 验证的规范,提供了多种常用的参数校验注解,例如 @NotNull、@Size 和 @Email 等。

为了使用 JSR303 参数校验注解,首先需要在项目中引入相应的依赖:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

然后,在需要进行参数校验的类中使用 JSR303 参数校验注解即可。例如,以下代码演示了如何使用 @NotNull 注解对一个参数进行非空校验:

@PostMapping("/user")
public User createUser(@RequestBody @Valid User user) {
    return userService.createUser(user);
}

在上面的代码中,@Valid 注解表示需要对 User 对象进行参数校验。如果 User 对象中的任何一个属性不符合 JSR303 参数校验注解的约束,则会抛出 MethodArgumentNotValidException 异常。

三、全局异常处理

Spring Boot 提供了两种方式来实现全局异常处理:

  1. 使用 @ControllerAdvice 注解和 @ExceptionHandler 注解。
  2. 实现 ErrorController 接口。

以下代码演示了如何使用 @ControllerAdvice 注解和 @ExceptionHandler 注解实现全局异常处理:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        List<String> errors = new ArrayList<>();
        for (FieldError error : ex.getBindingResult().getFieldErrors()) {
            errors.add(error.getDefaultMessage());
        }
        return ResponseEntity.badRequest().body(errors);
    }

}

在上面的代码中,@ControllerAdvice 注解表示这是一个全局异常处理类。@ExceptionHandler 注解表示该方法可以处理 MethodArgumentNotValidException 异常。

当 MethodArgumentNotValidException 异常发生时,Spring Boot 会自动调用 handleMethodArgumentNotValidException() 方法。该方法会将所有参数校验错误信息收集起来,并以 JSON 格式返回给客户端。

四、总结

Spring Boot 中的参数校验和全局异常处理非常重要,可以帮助我们提高代码的可读性和可维护性。通过使用 JSR303 参数校验注解和自定义 ExceptionHandler,可以轻松实现参数校验和全局异常处理。