【发布时间】: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) {
...
}
但是,如果我有不同的参数违规,例如,该怎么办? ConstraintViolationException 和 MethodArgumentTypeMismatchException 在同一个请求中?
如果无法处理异常列表,我如何满足 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