Spring HATEOAS 与 Spring Data Rest

Posted

技术标签:

【中文标题】Spring HATEOAS 与 Spring Data Rest【英文标题】:Spring HATEOAS versus Spring Data Rest 【发布时间】:2013-10-31 02:27:56 【问题描述】:

问题是, 有什么区别?

我觉得两者都可以做同样的事情,而且 Spring Data Rest(作为 Spring Data 的一部分)似乎更有活力。

https://github.com/spring-projects/spring-hateoas https://github.com/spring-projects/spring-data-rest

您什么时候会使用其中一种?

【问题讨论】:

【参考方案1】:

Spring HATEOAS 提供通用抽象(表示模型、Link 类、用于构建指向 Spring MVC 控制器的链接的 API 等)以简化使用 Spring MVC 构建超媒体驱动的 REST API。因此,您可以将它与 Spring MVC 一起使用来手动构建这些服务。

Spring Data REST 使用 Spring HATEOAS 自动为 Spring Data 存储库管理的实体公开资源,并利用超媒体方面进行分页、链接实体等。因此它涵盖了 80% 的基本用例,并允许您有选择地添加稍后使用手动实现的控制器进行更复杂的过程。

要了解这一点,请随时查看Spring RESTBucks 示例项目。 Order 实例的处理完全由 Spring Data REST 完成(通过一些小的调整来实现业务约束)。然后手动实现整个支付逻辑,因为该过程不属于 CRUD 类别,因为我们实际上需要实现某些步骤和协议来完成订单。同样,代码是here,带有一些额外视觉效果的幻灯片可以在speakerdeck.com找到。

【讨论】:

我要补充一点,Spring Data REST 明显依赖于 Spring HATEOAS:github.com/spring-projects/spring-data-rest/blob/… 第二段不是说清楚了吗? “Spring Data REST 使用 Spring HATEOAS……” 是的,绝对是,我提供了链接。我也喜欢你的截屏视频:-)【参考方案2】:

我选择在我的项目中同时使用它们。使用 Spring Data REST 构建了一层控制器。另一层控制器是@RestController (spring-wevmvc)。在这一层中,我使用 Spring HATEOAS 创建自定义页面。 (过程是: 1.创建可分页Pageable pageable = new PageRequest 2.新建页面Page<FooDt> page = new PageImpl<FooDt> 3.创建 PagedResources PagedResources<Resource<FooDt>> resource = fooAssembler.toResource(page, fooAssembler) 之后使用 Jackson 的 ObjectMapper 返回 json。

我发现将两种技术加载到上下文的解决方案是使用两个 DispatcherServlet。 否则,Spring Data Rest 将获得控制权,并且没有使用其他控制器的选项。 (这样我的应用程序中有两个域。一个用于 Data Rest,一个用于 webmvc+HATEOS)。

【讨论】:

对于更新版本的 SDR,您可以使用 @BasePathAwareController@RepositoryRestController 将您的自定义 MVC 控制器与 SDR 集成,而无需使用不同的 DispatcherServlets。【参考方案3】:

HATEOAS 代表 Hypermedia as the Engine of Application State,是 REST 的关键点之一。基本上,关键点在于使用资源表示上的链接来映射应用程序状态的有效转换。在这种情况下,服务提供商将提供可通过链接访问的应用程序的有效下一个正确状态。 Spring HATEOAS 是 Spring 项目,用于帮助在您的资源中构建 Hymeridia 控件。这是一个与 Spring MVC 集成的项目,您可以将其视为构建真正 RESTFull WS 的 Spring MVC 扩展,它非常支持将您的服务级别从 CRUD(Richardson 模型中的成熟度级别 2)提高到超媒体感知(Richardson 模型中的成熟度级别 3)。另一方面,Spring Data Rest 是一个非常好的项目,它使用 Spring HATEOAS 作为基本砖,为您提供一个可用作 restfull ws 的存储库层。在 proctis 中,该项目有助于减少将存储库层公开为 restfull 端点的经典 boliporlent 代码。我们可以说 tat 是项目的提议非常不同。使用 Spring HATEOAS,您有一个可用于任何类型的 restfull 端点的框架,使用 spring data rest,您有一个 spring 项目,该项目已经提供了一个端点和一个用于自定义它的框架。

我希望这些思考可以帮助您弄清两个项目之间的区别,并更好地了解如何使用其中一个

【讨论】:

以上是关于Spring HATEOAS 与 Spring Data Rest的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring HATEOAS 放置和发布链接

强制spring hateoas生成https链接而不是http

Spring Boot:HATEOAS 和自定义 JacksonObjectMapper

Spring Data Rest 和 Hateoas

如何删除 Spring HATEOAS 中的“_embedded”属性

我可以让自定义控制器镜像 Spring-Data-Rest / Spring-Hateoas 生成的类的格式吗?