内容简介:最近我被分配了一个任务:在SpringBoot的Web应用中实现异常处理机制。就像几乎所有SpringBoot项目一样, 有许多不同的方法来实现它。以下是我的研究结果和最终解决方案。不同需求如下:
最近我被分配了一个任务:在SpringBoot的Web应用中实现异常处理机制。就像几乎所有SpringBoot项目一样, 有许多不同的方法来实现它。以下是我的研究结果和最终解决方案。
需求
不同需求如下:
#1返回的错误消息必须与框架提供的格式兼容,特别是在JSON中,格式为:
{
<font>"timestamp"</font><font>: 1539797674906,
</font><font>"path"</font><font>: </font><font>"/"</font><font>,
</font><font>"status"</font><font>: 418,
</font><font>"error"</font><font>: </font><font>"I'm a teapot"</font><font>,
</font><font>"message"</font><font>: </font><font>"Teapot Mike!"</font><font>
}
</font>
出于多种原因,这种兼容性很重要。
首先,API使用者始终使用相同的错误格式
其次,仍然可以使用JSR-303 / JSR-348 Bean验证机制,我认为输入验证应该在域本身中进行,尽可能接近领域模型。然而,@NotNull等一些注释字段将让我们拒绝传入的请求因而无需进一步处理。如果发生验证错误,则会在响应中添加一个附加字段 - errors,这是映射到 BindingResult 对象的。
再者,现在有一种趋势是将应用程序代码尽可能地与框架分开。虽然我知道这个目的,但我也意识到应用程序是沉浸在框架中 - 在这种情况下,我发现使用框架机制是合理的。
#2应用程序中抛出的所有异常都应自动转换为相应的HTTP状态代码。
有人可能会想,我是想在应用程序中引入基于异常的通信。当然不是。我希望所有的异常都可以在视图层(@Controller)中解决。
#3所有异常应该从一个基类扩展(DomainException)
#4应该有一个集中的点,可以捕获和处理所有异常。另外,如果可以将这样的异常处理程序透明地注入到应用程序中,那将会很棒。
#5我想在错误响应中添加一个额外的字段 - traceId。在基于微服务的应用程序中,它使调试问题更少。
实现目标
要在基于 Spring Webflux 的应用程序中处理异常,您可以:
- 使用本地 @ExceptionHandler ,扩展 ResponseStatusException 或使用 @ResponseStatus 注释的异常类。
- 提供带注释的自定义类 @ControllerAdvice 。
- 提供扩展的自定义类 DefaultErrorAttributes 。
该文批判了前面两个点,理由非常饶人,这里不做详细阐述,文章最后推荐第三点:
第三点满足所有要求:
满足#1格式兼容性 - 正如我之前所说,在Spring Framework中没有代表错误响应的类,它只是一个Map。
对于#2和#3,我们有一个可扩展的DomainException - 一切都很好!
#4 DomainExceptionWrapper是一个可注入的单个组件,可以作为工件发布到maven存储库,并作为依赖项添加到其他应用程序。当上下文启动时,它将被自动检测并作为bean注入。它也很容易测试。
#5由于所有(域,运行时,Spring)异常都在一个地方处理,而旧的异常被Map用作返回的对象,因此很容易从中添加或删除字段。
以上所述就是小编给大家介绍的《Spring Webflux的业务领域异常机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 如何避免写出烂的业务代码(2):领域对象与领域服务
- 领域驱动设计 (DDD) 在爱奇艺打赏业务的实践
- [译] 实操微服务设计:从需求、领域模型、业务能力到服务
- 快讯| 开源网安获数千万战略融资,持续发力软件安全领域业务
- 快速失败机制 & 失败安全机制
- JavaScript线程机制与事件机制
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
High Performance Python
Micha Gorelick、Ian Ozsvald / O'Reilly Media / 2014-9-10 / USD 39.99
If you're an experienced Python programmer, High Performance Python will guide you through the various routes of code optimization. You'll learn how to use smarter algorithms and leverage peripheral t......一起来看看 《High Performance Python》 这本书的介绍吧!