【问题标题】:How to know which RestController is throwing a global exception?如何知道哪个 RestController 正在引发全局异常?
【发布时间】:2017-10-29 18:03:19
【问题描述】:

我有一个带有多个 RestController 的 Spring Boot 应用程序,每个都根据它们调用的服务连接到不同的数据库。

如果他们中的任何一个由于某种原因无法连接到数据库,我会抛出一条消息,如下所示:

@RestController
@RestControllerAdvice
public class GlobalExceptionHandler {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    // The Network Adapter could not establish the connection
    @ExceptionHandler(value = SQLRecoverableException.class)
    public ResponseEntity<String> handleBaseException(Exception e) {
        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body("Service Unavailable.");
    }

}

现在,是否可以确定哪个 RestController 触发了这个异常?

当我使用 @RestControllerAdvice 时,我不知道如何将全局异常连接到 Rest Controller

【问题讨论】:

  • 您能否在连接到数据库的地方添加一点控制器代码(在上述问题中)。也许我们可以在那里添加一个检查并解决我们的问题。

标签: rest spring-boot exception-handling


【解决方案1】:

Spring 提供两级异常处理,

1.控制器级别。
2.全球级别。

使用控制器级别的异常处理,如果需要基于控制器添加一些东西。

全局级处理意味着处理异常,而不管知道哪个控制器异常属于。

希望这能回答您的问题。最好在您的情况下进行控制器级别的异常处理。

如果您需要更多信息,请发表评论。

【讨论】:

  • 我考虑过控制器级别,但如果我有 30 多个控制器,我会在每个控制器中一遍又一遍地捕获相同的异常,复制代码。
  • 如果所有控制器都抛出这个异常,那么很可能使用全局异常处理程序。有什么理由需要控制器名称例外吗?如果您需要控制器名称必须例外,那么您必须使用每个控制器。如果不需要控制器名称,则使用全局建议。
  • 我试图确定谁触发了异常,因为我为每个服务保留一个日志文件(在这种情况下,它与每个控制器的一个日志文件相同)。拥有 30 多个服务,我想快速确定哪个服务在连接到数据库时遇到问题并相应地记录它,以便触发到位的警报。
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多