Spring Webflux的业务领域异常机制

栏目: Java · 发布时间: 6年前

内容简介:最近我被分配了一个任务:在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 的应用程序中处理异常,您可以:

  1. 使用本地 @ExceptionHandler ,扩展 ResponseStatusException 或使用 @ResponseStatus 注释的异常类。
  2. 提供带注释的自定义类 @ControllerAdvice
  3. 提供扩展的自定义类 DefaultErrorAttributes

该文批判了前面两个点,理由非常饶人,这里不做详细阐述,文章最后推荐第三点:

第三点满足所有要求:

满足#1格式兼容性 - 正如我之前所说,在Spring Framework中没有代表错误响应的类,它只是一个Map。

对于#2和#3,我们有一个可扩展的DomainException - 一切都很好!

#4 DomainExceptionWrapper是一个可注入的单个组件,可以作为工件发布到maven存储库,并作为依赖项添加到其他应用程序。当上下文启动时,它将被自动检测并作为bean注入。它也很容易测试。

#5由于所有(域,运行时,Spring)异常都在一个地方处理,而旧的异常被Map用作返回的对象,因此很容易从中添加或删除字段。


以上所述就是小编给大家介绍的《Spring Webflux的业务领域异常机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

使用HTML5和Node构建超媒体API

使用HTML5和Node构建超媒体API

【美】Mike Amundsen(麦克.阿蒙森) / 臧秀涛 / 电子工业出版社 / 2014-5 / 55.00元

《使用HTML5和Node构建超媒体API》探讨了超媒体API 的设计,介绍了作为超媒体API 的构件块的超媒体因子,并讲解了基本格式、状态转移、领域风格和应用流程这4 种超媒体设计元素;之后作者结合具体的场景,通过3个动手实验章节,从超媒体因子和超媒体设计元素入手,用实际的代码向我们详细地演示了超媒体API 的设计;最后介绍了超媒体设计的文档编写、注册与发布等内容。 《使用HTML5和No......一起来看看 《使用HTML5和Node构建超媒体API》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具