首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ControllerAdvice不处理引发的异常

基础概念

@ControllerAdvice 是 Spring 框架中的一个注解,用于全局处理控制器层的异常。它允许开发者在一个集中的地方定义异常处理逻辑,从而避免在每个控制器方法中重复编写异常处理代码。

相关优势

  1. 集中管理:将异常处理逻辑集中在一个地方,便于维护和管理。
  2. 代码复用:避免在多个控制器中重复相同的异常处理代码。
  3. 统一响应格式:可以定义统一的错误响应格式,提升用户体验和系统的一致性。

类型与应用场景

  • 全局异常处理:适用于所有控制器抛出的异常。
  • 特定异常处理:可以通过 @ExceptionHandler 注解指定处理特定类型的异常。
  • 特定控制器异常处理:结合 @ControllerAdvice@ExceptionHandler 可以针对特定控制器进行异常处理。

常见问题及原因

1. @ControllerAdvice 不处理引发的异常

原因分析

  • 未正确配置:可能没有在类上添加 @ControllerAdvice 注解。
  • 包扫描问题:Spring 可能没有扫描到包含 @ControllerAdvice 的类。
  • 异常类型不匹配@ExceptionHandler 方法可能没有正确指定要处理的异常类型。
  • 优先级问题:可能存在其他更具体的异常处理器优先处理了异常。

解决方案

1. 确保正确配置 @ControllerAdvice

代码语言:txt
复制
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

2. 检查包扫描路径

确保 Spring 配置文件或启动类中包含了正确的包扫描路径。

代码语言:txt
复制
@SpringBootApplication(scanBasePackages = "com.example")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. 明确指定异常类型

代码语言:txt
复制
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(SpecificException.class)
    public ResponseEntity<ErrorResponse> handleSpecificException(SpecificException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }
}

4. 调整异常处理优先级

如果存在多个异常处理器,可以通过 @Order 注解调整优先级。

代码语言:txt
复制
@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class HighPriorityExceptionHandler {
    // ...
}

示例代码

假设有一个控制器抛出了一个自定义异常 CustomException

代码语言:txt
复制
@RestController
public class ExampleController {

    @GetMapping("/example")
    public String example() throws CustomException {
        throw new CustomException("This is a custom exception.");
    }
}

对应的 @ControllerAdvice 处理器:

代码语言:txt
复制
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }
}

通过以上配置,当 ExampleController 抛出 CustomException 时,GlobalExceptionHandler 将会捕获并处理该异常。

总结

确保 @ControllerAdvice@ExceptionHandler 正确配置,并且 Spring 能够扫描到相关类。通过明确指定异常类型和调整优先级,可以有效解决 @ControllerAdvice 不处理异常的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

3分22秒

JavaSE进阶-163-运行时异常编写程序时可以不处理

3分24秒

23. 尚硅谷_佟刚_SpringMVC_SessionAttributes注解引发的异常.avi

5分3秒

day16_异常处理/12-尚硅谷-Java语言基础-编译时异常和运行时异常的不同处理

5分3秒

day16_异常处理/12-尚硅谷-Java语言基础-编译时异常和运行时异常的不同处理

5分3秒

day16_异常处理/12-尚硅谷-Java语言基础-编译时异常和运行时异常的不同处理

4分39秒

JavaSE进阶-165-异常处理的原理

6分43秒

Java中的异常处理你真的了解吗

16分21秒

day16_异常处理/07-尚硅谷-Java语言基础-异常的分类

16分21秒

day16_异常处理/07-尚硅谷-Java语言基础-异常的分类

16分21秒

day16_异常处理/07-尚硅谷-Java语言基础-异常的分类

7分12秒

83_尚硅谷_SpringMVC_SpringMVC的异常处理

3分25秒

16.Groovy中的类导入与异常处理

领券