SpringBoot 如何使用 @ControllerAdvice 注解进行全局异常处理

SpringBoot 如何使用 @ControllerAdvice 注解进行全局异常处理

在 Web 开发中,异常处理是非常重要的一环。在 SpringBoot 框架中,我们通常使用 @ExceptionHandler 注解来处理 Controller 层的异常。但是,如果想要处理全局异常,我们需要使用 @ControllerAdvice 注解。本文将介绍如何在 SpringBoot 中使用 @ControllerAdvice 注解进行全局异常处理。

在这里插入图片描述

什么是 @ControllerAdvice

@ControllerAdvice 注解是 Spring Framework 3.2 引入的一个新特性,它用于定义全局异常处理器。使用 @ControllerAdvice 注解,我们可以集中处理所有 Controller 层抛出的异常,而不必在每个 Controller 中单独处理。

@ControllerAdvice 注解通常与 @ExceptionHandler 注解一起使用,@ExceptionHandler 注解用于定义具体的异常处理方法,@ControllerAdvice 注解用于定义全局异常处理器。

如何使用 @ControllerAdvice 进行全局异常处理

使用 @ControllerAdvice 进行全局异常处理的步骤如下:

  1. 创建一个全局异常处理类

我们可以创建一个类并使用 @ControllerAdvice 注解进行标注,例如:

@ControllerAdvice
public class GlobalExceptionHandler {
    // 异常处理方法
}

在上述代码中,我们使用 @ControllerAdvice 注解标注了一个类,并命名为 GlobalExceptionHandler。接下来,我们可以在 GlobalExceptionHandler 类中定义具体的异常处理方法。

  1. 定义异常处理方法

在 GlobalExceptionHandler 类中定义具体的异常处理方法,例如:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }
}

在上述代码中,我们使用 @ExceptionHandler 注解定义了一个处理 Exception 类型异常的方法,并返回一个 ResponseEntity 对象。在处理方法中,我们可以根据具体的业务需求对异常进行相应的处理,并返回相应的结果。

  1. 处理其他类型的异常

除了处理 Exception 类型的异常外,我们还可以根据具体的业务需求,处理其他类型的异常。例如,如果我们想要处理参数校验失败的异常,可以在 GlobalExceptionHandler 类中定义一个处理 MethodArgumentNotValidException 类型异常的方法。

@ControllerAdvice
public class GlobalExceptionHandler {
    // 处理 Exception 类型异常的方法

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        String errorMessage = String.join(",", errorMessages);
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage);
    }
}

在上述代码中,我们使用 @ExceptionHandler 注解定义了一个处理 MethodArgumentNotValidException 类型异常的方法。在处理方法中,我们首先获取 BindingResult 对象,并遍历其中的所有错误信息,将它们合并为一个错误消息,并返回一个 ResponseEntity 对象。

完整代码示例

下面是一个完整的使用 @ControllerAdvice 进行全局异常处理的示例代码:

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        String errorMessage = String.join(",", errorMessages);
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage);
    }
}

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public Result addUser(@Validated @RequestBody User user) {
        // 处理添加用户的逻辑
    }
}

@Data
public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, message ="密码长度不能小于6")
    private String password;
}

在上述代码中,我们定义了一个 GlobalExceptionHandler 类,使用 @ControllerAdvice 注解标注,并在其中定义了处理 Exception 和 MethodArgumentNotValidException 类型异常的方法。

我们还定义了一个 UserController 类,并在其中定义了一个添加用户的接口。在添加用户接口中,我们使用 @Validated 注解对 User 对象进行参数校验,并在 User 类中使用了 javax.validation.constraints 包中的注解对 username 和 password 属性进行了校验。如果参数校验失败,会触发 MethodArgumentNotValidException 异常,在 GlobalExceptionHandler 类中的 handleMethodArgumentNotValidException 方法中进行处理。

总结

在本文中,我们介绍了如何在 SpringBoot 中使用 @ControllerAdvice 注解进行全局异常处理。通过使用 @ControllerAdvice 注解,我们可以集中处理所有 Controller 层抛出的异常,而不必在每个 Controller 中单独处理。在 GlobalExceptionHandler 类中定义异常处理方法,并根据具体的业务需求对异常进行相应的处理,可以大大提高代码的可维护性和可读性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@Path注解是JAX-RS规范中的注解,而Spring Boot是基于Spring框架的Web应用程序框架,两者并不是直接相关的。在Spring Boot中,通常使用@ControllerAdvice注解来定义全局异常处理器,它可以捕获所有Controller中抛出的异常,并根据异常类型或其他条件进行处理。 如果您的应用程序同时使用JAX-RS和Spring Boot,您可以使用Spring Boot的@ControllerAdvice注解来定义全局异常处理器,但是您需要使用JAX-RS的ExceptionMapper将JAX-RS的异常映射到Spring Boot异常处理器中。 例如,您可以创建一个类并使用@Provider注解将它标记为JAX-RS提供程序,并实现ExceptionMapper接口,将JAX-RS的异常映射到Spring Boot异常处理器中,如下所示: ``` @Provider public class MyExceptionMapper implements ExceptionMapper<Exception> { @Override public Response toResponse(Exception exception) { // 将JAX-RS的异常映射到Spring Boot异常处理器中 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Internal server error").build(); } } ``` 然后,您可以使用@ControllerAdvice注解来定义Spring Boot全局异常处理器,并处理所有异常,例如: ``` @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse errorResponse = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 需要注意的是,JAX-RS和Spring Boot异常处理器是两个不同的机制,需要通过ExceptionMapper将它们连接起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿徐师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值