当前位置: 首页 > 知识库问答 >
问题:

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

郝峰
2023-03-14

我有一个带有REST方法的控制器类,可以抛出各种异常。我已经决定在一个单独的类中处理这些异常,在我的处理程序方法中使用@ControlllerAdwn和@ExceptionHandler。但是,我有一个问题,我的REST方法使用另一个库的注释。此库捕获REST方法引发的异常。现在,我正在全局处理异常,而不是直接通过REST方法中的试/捕获,我的异常总是被其他库捕获,而不是被我自己的处理程序方法捕获。显然,我正在使用的库中的另一种方法由于注释而获胜。我如何将异常处理绑定到我自己的类,以防止它被其他人捕获?

我的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());
 }
}

由于库方法也捕获了非支持的操作异常,它由于@某些库注释而获胜,并且异常从未在我的处理程序类中处理过。

共有3个答案

柴意智
2023-03-14

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

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

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

第三种方法是使用AOP拦截器@后推@左右,然后执行您想要的任何逻辑。

本质:无法同时在两个地方处理异常。这有意义吗?

空英逸
2023-03-14

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

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

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

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

郏实
2023-03-14

您可以尝试在MyExceptionHandler类中使用@Order@Prience,如在设置多个@ControlllerAdwn@ExceptionHandler的优先级中所述。

这将使Spring有机会使用您的类,而不是由@某些库注释指定的类。然而,如果不知道Spring如何在上下文初始化时解释其他注释,这只是一个猜测。

 类似资料:
  • 我已经浏览了所有相关的帖子,但是我的@Controlller建议似乎没有处理从Controller类抛出的自定义异常。但是@Controller类中的@ExceptionHandler确实处理了异常。我不知道是什么错误。 网状物xml: dispatcher servlet。xml: @控制器建议等级: @ControllerAdvice与控制器位于同一个包中。

  • 我正在使用Spring Boot 1.5.9开发我的应用程序。我需要实现jwt身份验证,我使用了jjwt库。以下代码来自我的自定义身份验证安全筛选器,它继承自。在这里,我试图从令牌解析用户名,当自动解析用户名时,jwt会验证用户名,并检查令牌的过期时间。我调试了它,它可以工作,所以接下来我想向客户端应用发送正确的消息,说明身份验证失败的原因。我想抛出一个ExpiredJwtException,并使

  • 我尝试用的一个实例替换错误处理程序,但没有成功。 我尝试创建自己的CustomErrorHandler,但这也不合适,因为在重新路由到自定义错误控制器时,原始异常已不再存在于该异常中。为了向客户端返回适当的响应,需要这些信息。 吾如何曰: 使SpringBoot不将异常转发到异常控制器。 还原@ControllerAdvice异常处理程序,这样我就可以返回适当的响应正文和状态代码。

  • 问题内容: 当我运行多线程代码时,系统(linux)有时会将线程从一个处理器移动到另一个处理器。由于我拥有与处理器一样多的线程,因此它没有充分的理由使缓存无效,并且使我的跟踪活动混乱。 您知道如何将线程绑定到处理器,为什么系统会这样做? 问题答案: 使用(这是特定于Linux的)。 为什么调度程序会在不同处理器之间切换线程?好吧,假设您的线程最后一次在处理器1上运行,并且当前正在等待再次安排执行时

  • 我有以下控制器类 } 对于异常处理,我使用Spring3。2.建议如下: } 我将XML bean定义为 控制器通知处理程序不处理从控制器引发的异常。我在谷歌上搜索了几个小时,但找不到它发生的原因。我照着描述的做了http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/在这里 如果有人知道,请告诉

  • 我正在尝试这里提供的解决方案https://social.msdn.microsoft.com/forums/en-us/16a91381-0714-4ba1-aff0-7f3b6483b282/populate-a-treeview-from-xsd-file-in-wpf?forum=wpf只采用xs:element和xs:sequence节点,排除所有其他节点(xs:complextype>