SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

在 SpringBoot 应用程序中,RESTful 异常处理是一个非常重要的话题。当 RESTful API 出现异常时,我们需要对异常进行处理,以保证 API 的稳定性和可靠性。SpringBoot 提供了一种方便的方式来处理 RESTful 异常,即使用 @RestControllerAdvice 注解。本文将介绍如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理。

SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理_第1张图片

什么是 @RestControllerAdvice 注解?

@RestControllerAdvice 注解用于定义全局的 RESTful 异常处理器。当应用程序中抛出异常时,SpringBoot 会自动调用 @RestControllerAdvice 注解标注的类中的方法进行处理,并返回一个包含错误信息的 JSON 响应。该注解的语法如下:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        // 处理异常并返回错误响应
    }
}

在上面的代码中,@RestControllerAdvice 注解定义了一个类 GlobalExceptionHandler,用于全局 RESTful 异常处理。当应用程序中抛出异常时,SpringBoot 会自动调用 GlobalExceptionHandler 类中的方法进行处理,并返回一个包含错误信息的 JSON 响应。

如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

下面我们通过一个示例来演示如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理。

步骤 1:创建 SpringBoot 项目

首先,我们需要创建一个 SpringBoot 项目。可以使用 Spring Initializr 快速创建一个空的 SpringBoot 项目。在项目中添加以下依赖:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-validationartifactId>
dependency>

其中,spring-boot-starter-web 依赖用于创建 Web 项目,spring-boot-starter-validation 依赖用于数据校验。

步骤 2:定义异常类

接下来,我们需要定义一个异常类,用于抛出异常。具体代码如下:

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class BadRequestException extends RuntimeException {

    public BadRequestException(String message) {
        super(message);
    }

}

在上面的代码中,BadRequestException 类继承了 RuntimeException 类,并使用 @ResponseStatus 注解指定了 HTTP 状态码为 400(Bad Request)。

步骤 3:校验请求参数

接下来,我们需要在控制器中添加数据校验逻辑,以确保请求参数的有效性。具体代码如下:

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        User savedUser = userRepository.save(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
    }

}

在上面的代码中,我们使用 @Valid 注解和 @RequestBody 注解来校验请求体中的数据。如果请求参数不符合校验规则,则会抛出 MethodArgumentNotValidException 异常。

步骤 4:创建全局异常处理器

最后,我们需要创建一个全局 RESTful 异常处理器,用于处理应用程序中抛出的异常。具体代码如下:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
        String message = ex.getBindingResult().getFieldError().getDefaultMessage();
        ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), message);
        return ResponseEntity.badRequest().body(errorResponse);
    }

    @ExceptionHandler(BadRequestException.class)
    public ResponseEntity<ErrorResponse> handleBadRequestException(BadRequestException ex) {
        ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), ex.getMessage());
        return ResponseEntity.badRequest().body(errorResponse);
    }

}

在上面的代码中,我们使用 @RestControllerAdvice 注解定义了一个类 GlobalExceptionHandler,用于全局 RESTful 异常处理。其中,@ExceptionHandler 注解用于指定处理特定类型的异常的方法。在上面的代码中,我们定义了处理 MethodArgumentNotValidExceptionBadRequestException 的方法,并返回一个包含错误信息的 JSON 响应。

ErrorResponse 类用于封装错误信息和 HTTP 状态码。具体代码如下:

public class ErrorResponse {

    private int statusCode;
    private String message;

    public ErrorResponse(int statusCode, String message) {
        this.statusCode = statusCode;
        this.message = message;
    }

    // getter 和 setter 方法省略
}

在上面的代码中,ErrorResponse 类包含了 HTTP 状态码和错误信息两个属性。我们可以在全局 RESTful 异常处理器中使用该类来封装错误信息和 HTTP 状态码,并返回一个包含错误信息的 JSON 响应。

步骤 5:测试

最后,我们可以使用 Postman 或类似的工具来测试我们的控制器。例如,我们可以发送一个 POST 请求到 /users,并在请求体中添加无效的数据,这会导致控制器抛出 MethodArgumentNotValidException 异常,并返回 HTTP 状态码为 400 和包含错误信息的 JSON 响应。

总结

本文介绍了如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理。通过 @RestControllerAdvice 注解,我们可以方便地定义全局的 RESTful 异常处理器,并处理应用程序中抛出的异常。在实际开发中,我们可以根据具体的业务需求来选择合适的异常处理方式,并编写相应的异常处理逻辑,以保证 API 的稳定性和可靠性。

你可能感兴趣的:(Java,教程,restful,spring,boot,java)