我有以下问题。每当我想要操纵从控制器返回的HTTP响应时,我就会发现自己在Spring的 RestController 中使用 ResponseEntity 。
现在让我们说这个响应的结果确实取决于下面业务层上发生的事情。假设该层进行了http调用,如果操作正确,则我在肯定消息上方转发,而不是否定消息。
我的控制器现在收到一条消息,但是最好分析一下下面发生的事情是否成功。因此,我可以从业务级别返回一个 ResponseEntity 并将其标记为400或200(取决于随后发生的情况)还是有另一种更好的做法?
答案 0 :(得分:2)
可以。从技术上讲,ResponseEntity
是一个与其他任何类一样的类,您可以从任何层返回它的一个实例。
尽管您应该问自己一个问题,这是从假定执行一些业务逻辑的方法返回该类的对象的一种好习惯吗?对我来说,这感觉不对。您将引入层次来分离关注点。您的域层应该完全不了解您的应用程序提供的通信协议。
如果正确设计域层,您将基于抛出的异常知道出了什么问题。然后,您还将知道应该返回哪种HTTP状态。
答案 1 :(得分:1)
这违反了层分离的概念:在HTTP语言和应用程序内部语言(API)之间进行转换是控制器的唯一工作,并且是控制器的唯一工作 。如果将来您想更改HTTP API的工作方式但同时支持多个版本该怎么办?
相反,这恰恰是例外的目的:从您的业务方法中抛出明智的例外。我经常创建异常类型的子类,例如IllegalStateException
来表示特定于应用程序的错误,有时我直接使用现有的异常类。