内容简介:最近我被分配了一个任务:在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线程机制与事件机制
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
使用HTML5和Node构建超媒体API
【美】Mike Amundsen(麦克.阿蒙森) / 臧秀涛 / 电子工业出版社 / 2014-5 / 55.00元
《使用HTML5和Node构建超媒体API》探讨了超媒体API 的设计,介绍了作为超媒体API 的构件块的超媒体因子,并讲解了基本格式、状态转移、领域风格和应用流程这4 种超媒体设计元素;之后作者结合具体的场景,通过3个动手实验章节,从超媒体因子和超媒体设计元素入手,用实际的代码向我们详细地演示了超媒体API 的设计;最后介绍了超媒体设计的文档编写、注册与发布等内容。 《使用HTML5和No......一起来看看 《使用HTML5和Node构建超媒体API》 这本书的介绍吧!