为了账号安全,请及时绑定邮箱和手机立即绑定

仅将异常处理绑定到 @ControllerAdvice 类

仅将异常处理绑定到 @ControllerAdvice 类

慕慕森 2022-06-15 16:32:45
我有一个带有 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();}我的异常处理程序类:@ControllerAdvicepublic class MyExceptionHandler { @ExceptionHandler(UnsupportedOperationException.class) public ResponseEntity<?> handleUnsupportedOperationException(UnsupportedOperationException e) {            return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage()); }}由于库方法还捕获 UnsupportedOperationException,因此它会因 @SomeLibraryAnnotation 而获胜,并且该异常从未在我的处理程序类中处理。
查看完整描述

3 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

您可以尝试在类中使用@Orderor ,如设置多个 @ControllerAdvice @ExceptionHandlers 的优先级中所述@PriorityMyExceptionHandler

这将使 Spring 有机会使用您的类而不是@SomeLibraryAnnotation. 但是,在不知道 Spring 在上下文初始化时如何解释其他注释的情况下,这只是一个猜测。


查看完整回答
反对 回复 2022-06-15
?
呼唤远方

TA贡献1856条经验 获得超11个赞

这些只是 Java 语言规则,即异常不再是unhandled,因为它已由您的其他库处理(在 catch 块中捕获)。你可以做的是在你的库中重新抛出(可能有条件地)另一个捕获原始异常的异常,看看是否@ExceptionHandler会处理它。这可能不是因为@ExceptionHandler正在处理 Controller 类中引发的异常。

第二种方法是抛出仅在 @ExceptionHandler 中处理的异常,然后重新抛出它在其他库中处理。

换句话说,您需要选择在哪里处理最初抛出的异常。

第三种方法是使用 AOP 拦截器@AfterThrowing,或者@Around然后执行您想要的任何逻辑。

本质:没有办法同时处理两个地方的异常。是否有意义?


查看完整回答
反对 回复 2022-06-15
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

您是否尝试@ExceptionHandler在控制器内部编写代码?喜欢:


@RestController

@RequestMapping("/path")

public class TheController {


     @ExceptionHandler(UnsupportedOperationException.class)

     public ResponseEntity<?> handleUnsupportedOperationException(UnsupportedOperationException e) {        

        return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());

     }

}

也许这会以更高的优先级拾取和例外。很难回答不知道是什么@SomeLibraryAnnotation...


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信