ResponseEntity 可以在 Spring 中的控制器之外使用吗?

Can ResponseEntity be used outside of Controllers in Spring?

我有以下问题。我发现自己在 Spring 中的 RestController 中使用 ResponseEntity ,每当我想操纵从我的控制器返回的 HTTP 响应时。

现在假设此响应的结果确实取决于下面的业务层发生的情况。假设这一层进行了一个 http 调用,如果它正确,我转发回正面消息,而不是转发负面消息。

我的控制器现在收到一条消息,但如果能分析下面发生的事情是否成功,那就更好了。那么,我可以 return 从业务级别 ResponseEntity 并将其标记为 400 或 200(取决于那里发生的情况)还是有其他更好的做法?

这违反了分层的概念:它是控制器的唯一工作,只有控制器的工作,在 HTTP 语言和应用程序的内部语言之间进行转换 ( API)。如果将来您想要更改 HTTP API 的工作方式但同时支持多个版本怎么办?

相反,这正是异常的用途:从您的业务方法中抛出一个合理的异常。我经常创建IllegalStateException等异常类型的子类来表示应用程序特定的错误,有时我会直接使用现有的异常类。

当然可以。从技术上讲,ResponseEntity 和其他任何东西一样都是 class,您可以从任何层 return 它的实例。

不过,您应该问自己的问题是,从假设执行某些业务逻辑的方法中 return 那个 class 的对象,这是一个好的做法吗?对我来说,这感觉不对。您引入层来分离关注点。您的域层应该完全不知道您的应用程序提供的关闭通信协议。

如果您正确设计领域层,您将根据抛出的异常知道哪里出了问题。然后您还会知道应该使用哪种 HTTP 状态 return.