【发布时间】:2019-08-01 18:19:33
【问题描述】:
问题
在 Spring Boot 中创建控制器以自定义方式处理所有错误/异常时,包括自定义异常,应该首选哪种技术?
控制器是否应该实现 Spring Boot 的
ErrorController?控制器是否应该扩展 Spring 的
ResponseEntityExceptionHandler?两者:单个控制器实现和扩展两个类,包括它们的两个功能?
两者:两个独立的控制器,一个实现
ErrorController,另一个扩展ResponseEntityExceptionHandler?
目标
这篇文章的原因是为了找到一种在 Spring Boot 中使用以下属性所有处理异常的方法:
- 应捕获在处理请求期间出现在控制器/过滤器/拦截器中的所有
Throwables。 - 在捕获
Throwable的情况下,我们不希望永远向客户端公开任何堆栈跟踪或其他实现细节(除非明确编码那样)。 - 应该可以按其类分别处理所有发生的
Throwables。对于任何其他未指定的类型,可以指定默认响应。 (我确信,@ExceptionHandler可以做到这一点。但是ErrorController?) - 代码应尽可能简洁明了,没有丑陋的变通办法或 UB 来实现这一目标。
更多详情
我注意到两个控制器(参见上面的 1 和 2)可能包含返回 ResponseEntity 对象的方法,从而处理发生的异常并向客户端返回响应。那么理论上它们可以产生相同的结果吗?
有几个关于使用技术 1 和 2 的教程。但我没有发现任何文章考虑这两个选项、比较它们或一起使用它们,这引发了几个额外的问题:
是否应该一起考虑?
这两种提议的技术之间的主要区别是什么?有什么相似之处?
其中一个版本是否比另一个版本更强大?有没有什么可以做而另一个不能做的事情,反之亦然?
它们可以一起使用吗?是否有必要这样做?
如果它们一起使用,将如何处理异常?它是通过两个处理程序还是一个处理程序?如果是后者,是哪一个?
如果它们一起使用,并且在内部控制器(一个或另一个)在异常处理期间抛出异常,该异常将如何处理?它是否发送到另一个控制器?理论上异常会开始在控制器之间反弹或创建其他类型的不可恢复循环吗?
是否有任何关于 Spring Boot 如何在内部使用 Spring 的
ResponseEntityExceptionHandler或它期望它如何在 Spring Boot 应用程序中使用的可信/官方文档?如果只有
ResponseEntityExceptionHandler就足够了,那为什么ErrorController还存在呢?
当查看 Spring 的 ResponseEntityExceptionHandler 和 @ExceptionHandler 注解时,它似乎在分别处理不同类型的异常和使用更简洁的代码方面更强大。但是由于 Spring Boot 是建立在 Spring 之上的,这是否意味着:
- 在使用Spring Boot时,我们应该实现
ErrorController而不是扩展ResponseEntityExceptionHandler? -
ErrorController可以做ResponseEntityExceptionHandler可以做的所有事情,包括分别处理不同类型的异常吗?
【问题讨论】:
标签: java spring spring-boot exception error-handling