如何发展 Spring Data REST 应用程序?
How to evolve a Spring Data REST application?
我一直在研究 Spring Data REST,这是个好东西。我喜欢 HATEOAS 集成和 ALP。很明显,它可以通过默认或少量配置解决许多用例。
我的顾虑是:
如果我的业务规则在控制器中变得更加复杂,如何改进它?
有没有办法覆盖默认控制器以包含资源的特定代码?
解决概述的挑战有两个方面可能很有趣。
使用事件监听器
如果您只想拦截支持公开资源的 CRUD 操作,您可以实施 AbstractRepositoryEventListener
。它允许您同步拦截 Spring Data REST 控制器对实体施加的操作。这里要提到的用例可以是额外的验证、日志记录、过滤等。
制作你自己的控制器类
自定义请求触发的功能的另一种方法是使用手动实现的控制器覆盖特定的请求映射。这可用于使用新功能扩充资源(例如,通过 produces
属性公开新媒体类型)或通过简单地在控制器方法上声明匹配的请求映射来完全替换功能。
其他方面
通常标准资源模型不足以表达域逻辑或者可能不适合。然后,用户通常会制作他们自己的控制器,他们基本上将这些控制器融入到 Spring 数据 REST 公开的资源的关系 space 中。
为了整合两个世界,可以使用 ResourceProcessor
添加指向表示的链接,以将客户指向手动实现的功能。
有关示例,请参阅 the Spring RESTBucks project。订单的核心生命周期由 Spring Data REST 处理。然而,订单的核心状态转换是支付的触发,这是在单独的 PaymentController
中实现的。然后使用 PaymentOrderResourceProcessor
.
在订单资源中宣传支付功能
我一直在研究 Spring Data REST,这是个好东西。我喜欢 HATEOAS 集成和 ALP。很明显,它可以通过默认或少量配置解决许多用例。
我的顾虑是:
如果我的业务规则在控制器中变得更加复杂,如何改进它?
有没有办法覆盖默认控制器以包含资源的特定代码?
解决概述的挑战有两个方面可能很有趣。
使用事件监听器
如果您只想拦截支持公开资源的 CRUD 操作,您可以实施 AbstractRepositoryEventListener
。它允许您同步拦截 Spring Data REST 控制器对实体施加的操作。这里要提到的用例可以是额外的验证、日志记录、过滤等。
制作你自己的控制器类
自定义请求触发的功能的另一种方法是使用手动实现的控制器覆盖特定的请求映射。这可用于使用新功能扩充资源(例如,通过 produces
属性公开新媒体类型)或通过简单地在控制器方法上声明匹配的请求映射来完全替换功能。
其他方面
通常标准资源模型不足以表达域逻辑或者可能不适合。然后,用户通常会制作他们自己的控制器,他们基本上将这些控制器融入到 Spring 数据 REST 公开的资源的关系 space 中。
为了整合两个世界,可以使用 ResourceProcessor
添加指向表示的链接,以将客户指向手动实现的功能。
有关示例,请参阅 the Spring RESTBucks project。订单的核心生命周期由 Spring Data REST 处理。然而,订单的核心状态转换是支付的触发,这是在单独的 PaymentController
中实现的。然后使用 PaymentOrderResourceProcessor
.