java - 仅将异常处理绑定到 @ControllerAdvice 类
问题描述
我有一个带有 REST 方法的控制器类,可以抛出各种异常。我决定在一个单独的类中使用 @ControllerAdvice 和 @ExceptionHandler 作为我的处理程序方法来处理这些异常。但是,我有一个问题,即我的 REST 方法使用来自另一个库的注释。这个库捕获了我的 REST 方法也抛出的异常。现在我正在全局处理异常,而不是直接通过 REST 方法中的 try/catch,我的异常总是被其他库而不是我自己的处理程序方法捕获。显然,由于注释,我正在使用的库中的其他方法获胜。如何将异常处理绑定到我自己的类以防止它被其他人捕获?
我的 REST 方法:
@SomeLibraryAnnotation
@PostMapping(path = "/add", consumes = MediaType.APPLICATION_JSON_VALUE)
public HttpEntity< ? > addItem(@RequestHeader HttpHeaders headers, @RequestBody MyDTO myDTO)
throws UnsupportedOperationException {
doSomethingWith(myDTO);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
我的异常处理程序类:
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(UnsupportedOperationException.class)
public ResponseEntity<?> handleUnsupportedOperationException(UnsupportedOperationException e) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());
}
}
由于库方法还捕获了 UnsupportedOperationException,因此由于 @SomeLibraryAnnotation 而获胜,并且该异常从未在我的处理程序类中处理。
解决方案
这些只是 Java 语言规则,即异常不再是unhandled,因为它已由您的其他库处理(在 catch 块中捕获)。你可以做的是在你的库中重新抛出(可能有条件地)另一个捕获原始异常的异常,看看是否@ExceptionHandler
会处理它。这可能不是因为@ExceptionHandler
正在处理 Controller 类中引发的异常。
第二种方法是抛出仅在 @ExceptionHandler 中处理的异常,然后重新抛出它在其他库中处理。
换句话说,您需要选择在哪里处理最初抛出的异常。
第三种方法是使用 AOP 拦截器@AfterThrowing
,或者@Around
然后执行您想要的任何逻辑。
本质:没有办法同时处理两个地方的异常。是否有意义?
推荐阅读
- excel - 语法错误 CountIfs-function 多条件
- python - python函数参数中的三元运算符使用默认值
- c# - 在 azure 函数中获取队列名称或主题+订阅者名称(Azure 服务总线触发函数)
- amazon-web-services - AWS Neptune 中的元属性
- javascript - Javascript:当鼠标移过它们时突出显示所有段落,然后在鼠标经过后恢复
- javascript - 如何在 YII2 中使用 PJAX 处理来自控制器的错误?
- vue.js - 在 index.html 中使用 vue js 变量
- c# - Wix 安装程序实用程序:XmlFile
- ansible - 来自 jinja2 的 Ansible 模板
- python - 如何使用 pyautogui 使用 ubuntu 的“Windows”或“Super”键?