【问题标题】:Spring boot custom logic for 500 errors500错误的Spring Boot自定义逻辑
【发布时间】:2021-09-25 15:01:31
【问题描述】:

在 Spring Boot 中,如何添加针对任何 500 错误运行的额外服务器逻辑?我不想更改返回 500 错误的情况;我只是想添加一些额外的处理来在发生 500 时捕获一些崩溃信息。

我已经尝试过@ExceptionHandler 和类似的方法,但似乎无法为“任何会生成 500 的东西”添加处理程序。在我的搜索中,我似乎只能找到描述如何更改哪些异常产生 500 错误的文章,而不是更改发生 500 错误时发生的情况。

【问题讨论】:

  • 因为 500 是流中未捕获异常的 HTTP 表示。所以你应该简单地使用@ExceptionHandler für Exception.class 然后相应地处理它。
  • @jAC 这根本不是真的,有很多定义明确的异常会返回 500 INTERNAL SERVER ERROR 你可以在这里看到一些github.com/spring-projects/spring-framework/blob/main/…
  • 我要做的是改为编写一个过滤器,它将拦截所有包含 HttpStatus 500 的响应,然后在过滤器中进行日志记录。
  • @Toerktumlare - 啊,这可以工作。虽然我认为我手头上仍然没有异常来捕获它的堆栈跟踪?

标签: spring-boot


【解决方案1】:

以下是我得出的解决方案。我不确定这是“正确”的答案,但它似乎有效。

(@Toerktumlare 建议使用过滤器是一个很好的建议,尽管在我的情况下,我想要的“崩溃信息”包括一个异常堆栈跟踪,它在过滤器中不可用。)

我所做的是在 @ControllerAdvice 类中添加两个 @ExceptionHandler 方法。

第一种方法处理ResponseStatusException,它专门用于指示特定的 HTTP 状态代码。这是 Spring 创建的大约十几个内置异常的超类。如果代码为 500,我会将异常视为“崩溃”并收集额外信息:

@ExceptionHandler({ResponseStatusException.class})
protected ResponseEntity<Object> handleResponseStatusException(ResponseStatusException ex, WebRequest request) {
    if (ex.getStatus() == INTERNAL_SERVER_ERROR) {
        return handleCrash(ex, request);
    } else {
        return new ResponseEntity<>(ex.toString(), responseHeaders(), status);
    }
}

private static HttpHeaders responseHeaders() {
    HttpHeaders result = new HttpHeaders();
    result.setContentType(TEXT_PLAIN);
    return result;
}

第二种方法是其他处理程序尚未处理的其他异常的后备:

@ExceptionHandler({Exception.class})
protected ResponseEntity<Object> handleMiscellaneousServerError(Throwable ex, WebRequest request) {
    return handleCrash(ex, request);
}

这会将所有其他异常转换为 500 错误。我还没有使用这个解决方案足够长的时间来知道这是否可以。

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 2020-03-01
    • 2014-12-01
    • 2016-03-31
    • 2014-11-30
    • 2018-02-11
    • 2015-09-04
    • 2017-01-21
    • 2019-04-07
    相关资源
    最近更新 更多