【问题标题】:Spring Boot Exception Handler get all Exceptions at onceSpring Boot 异常处理程序一次获取所有异常
【发布时间】:2021-01-16 16:54:10
【问题描述】:

有没有办法在 Spring Boot 异常处理程序中一次捕获从 Web 请求中抛出的所有异常?我知道我可以在用@ExceptionHandler 注释的方法中捕获一组异常类型,但这不是我正在谈论的类型。我需要一个异常对象列表之类的东西。我已经试过了

@@ExceptionHandler({ MethodArgumentTypeMismatchException.class, ConstraintViolationException.class })
@ResponseBody
private Error handleException(final List<Exception> ex, WebRequest request) {
...
}

但 Spring 无法找到合适的解析器:

java.lang.IllegalStateException: Could not resolve parameter [0] in private com.example.demo.model.Error com.example.demo.exception.MyExceptionHandler.handleException(java.util.List<java.lang.Exception>,org.springframework.web.context.request.WebRequest): No suitable resolver

只捕获一个 Throwable 对象就可以正常工作:

@ExceptionHandler({ MethodArgumentTypeMismatchException.class, ConstraintViolationException.class })
@ResponseBody
private Error handleException(final Exception ex, WebRequest request) {
...
}

但是,如果我有不同的参数违规,例如,该怎么办? ConstraintViolationExceptionMethodArgumentTypeMismatchException 在同一个请求中?

如果无法处理异常列表,我如何满足 RFC-7807(请参阅https://www.rfc-editor.org/rfc/rfc7807)?这意味着:无论导致异常的原因是什么,我如何收集所有无效参数?

【问题讨论】:

  • 您的请求在任何时候都只会有一个例外,而不是多个
  • 如果你有几个错误,只有其中一个(根据某些逻辑第一个)会抛出异常,而不是一次。您是否想要一种方法来捕获 Spring Boot 应用程序中所有可能的异常?
  • 大家好,感谢您的回复。听起来 Spring Boot 缺少此功能。根据 RFC 7807 定义(请参阅tools.ietf.org/html/rfc7807),在 400 Bad Request 响应中提供“invalid-params”字段会很有用,其中填充了所有违反的参数,无论原因是什么。 Spring Boot 中有没有办法实现这一点?我是否必须实现一些不同的东西而不是异常处理程序?

标签: java spring spring-boot exception


【解决方案1】:

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-exceptionhandler

@ExceptionHandler
public ResponseEntity<String> handle(Exception ex) {
    // ...
}

您将捕获最常见的异常。然后你可以被压制 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Throwable.html#getSuppressed()

你不能一次抛出多个异常

【讨论】:

  • getSupressed() 在异常处理程序的情况下返回空数组
【解决方案2】:

我不知道注释,但要捕获多个异常(请记住,第一个匹配的catch 块将执行):

@ResponseBody
public MyError handleException(List<Throwable> exceptions, WebRequest request) {
    try {
        //...
    } catch (ConstraintViolationException e) {
        //...
    } catch (MethodArgumentTypeMismatchException e) {
        //...
    }
}

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 2023-03-28
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2015-02-23
    • 2016-09-29
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多