【发布时间】:2015-06-02 16:09:11
【问题描述】:
我一直在搞乱 Spring Data REST,这是个好东西。我喜欢 HATEOAS 集成和 ALP。很明显,它可以通过默认或少量配置解决许多用例。
我的担忧是:
如果我的业务规则在控制器中变得更加复杂,如何改进它?
有没有办法覆盖默认控制器以包含资源的特定代码?
【问题讨论】:
标签: rest spring-data spring-data-rest
我一直在搞乱 Spring Data REST,这是个好东西。我喜欢 HATEOAS 集成和 ALP。很明显,它可以通过默认或少量配置解决许多用例。
我的担忧是:
如果我的业务规则在控制器中变得更加复杂,如何改进它?
有没有办法覆盖默认控制器以包含资源的特定代码?
【问题讨论】:
标签: rest spring-data spring-data-rest
解决上述挑战可能有两个方面很有趣。
如果您只想拦截支持公开资源的 CRUD 操作,您可以实现 AbstractRepositoryEventListener。它允许您同步拦截 Spring Data REST 控制器对实体施加的操作。这里提到的用例可以是额外的验证、日志记录、过滤等。
另一种自定义请求触发的功能的方法是使用手动实现的控制器覆盖特定的请求映射。这可用于使用新功能增加资源(例如,通过produces 属性公开新媒体类型)或通过简单地在控制器方法上声明匹配请求映射来完全替换功能。
通常标准资源模型不足以表达领域逻辑,或者可能不适合。然后,用户通常会制作自己的控制器,它们基本上会融入 Spring Data REST 公开的资源的关系空间中。
为了整合这两个世界,ResourceProcessor 可用于添加指向表示的链接,以将客户端指向手动实现的功能。
有关示例,请参阅the Spring RESTBucks project。订单的核心生命周期由 Spring Data REST 处理。但是,订单的核心状态转换是触发支付,这在单独的PaymentController 中实现。然后使用PaymentOrderResourceProcessor 在订单资源中宣传支付功能。
【讨论】: