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