仅对@ControllerAdvice类的绑定异常处理

问题描述 投票:2回答:3

我有一个带有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 spring exception-handling spring-annotations
3个回答
0
投票

您可以尝试在@Order类中使用@PriorityMyExceptionHandler,如Setting Precedence of Multiple @ControllerAdvice @ExceptionHandlers中所述。

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


0
投票

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

@RestController
@RequestMapping("/path")
public class TheController {

     @ExceptionHandler(UnsupportedOperationException.class)
     public ResponseEntity<?> handleUnsupportedOperationException(UnsupportedOperationException e) {        
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());
     }
}

也许这会优先处理和例外。不知道@SomeLibraryAnnotation是什么,很难回答...


0
投票

这些都是简单的Java语言规则,即不再是unhandled,因为它是由您的其他库处理的(捕获在catch块中)。您可以做的是在库中重新引发(可能有条件地)捕获到原始异常的另一个异常,然后查看@ExceptionHandler是否会处理它。

另一种方法是使用AOP拦截器@AfterThrowing@Around,然后执行所需的任何逻辑。

无法同时在两个地方处理异常。有道理吗?

© www.soinside.com 2019 - 2024. All rights reserved.