没有HATEOAS的Spring数据休息

Mat*_*att 17 spring-data-rest spring-hateoas

我真的很喜欢Spring Data Rest为你写的所有样板代码,但我宁愿只是一个'常规?' 没有所有HATEOAS东西的REST服务器.主要原因是我在客户端使用Dojo Toolkit,并且它的所有小部件和存储都被设置为返回的json只是一个直接的项目数组,没有所有链接和类似的东西.有谁知道如何配置这个与java配置,以便我得到所有为我编写的mvc代码,但没有所有的HATEOAS东西?

Oli*_*ohm 7

那么你想要没有构成REST的东西的REST吗?:)我认为尝试改变(阅读:哑巴)RESTful服务器以满足设计糟糕的客户端库是一个糟糕的开始.但是,这就是为什么超媒体元素对于这种工具是必要的(除了可能熟悉的一般基本原理).

大多数REST社区都经常看到将域对象暴露给Web.主要是因为域对象的边界不一定是您想要提供资源的边界.然而,在过去几年中,提供脚手架功能的框架(Rails,Grails等)已经变得非常流行.所以Spring Data REST正试图解决这个问题,但同时也是一个好的公民,在休息方面.

因此,如果您首先从一个普通的数据模型开始(没有很多关系的对象),只想阅读它们,实际上不需要像Spring Data REST这样的东西.您需要编写的Spring控制器在Spring Data存储库之上大约有10行代码.当事情变得更具挑战性时,故事变得更加有趣:

  • 如何在没有硬编码URI的情况下编写客户端(如果确实如此,它不是特别安静)?
  • 你如何处理资源之间的关系?你如何让客户创建,更新它们等?
  • 客户端如何发现哪些查询资源可用?它如何找出通过的参数等?

如果您对这些问题的回答是:"我的客户端不需要/无法执行此操作.",那么Spring Data REST可能是错误的库.你基本上构建的是基于HTTP的JSON,但是没有什么比这更好的了.如果它符合您的目的,这是完全正常的,但是将具有明确设计约束的图书馆拴入任意不同的(虽然显然相似),有效地想要完全忽略这些设计方面是首先是错误的方法.

  • 在考虑之后,我得出的结论是SDR作者在这里过于教条.使用一个比喻,有点像他们制造无线电控制铲的情况,他们不会创建一个允许用户移除无线电天线的机制,即使用户抱怨天线确实进入他们在没有无线电控制的情况下大量使用它的方式.不幸的是,如果你建议用户只是采用不同的铲子进行手工操作,这个比喻就会失败.对于Web服务来说,这真的不是那么简单. (14认同)
  • REST并不意味着HATEOAS或超媒体.这是一种定义从原始源渲染数据的责任的方法,基本上就是这样.甚至JSON也不是遵循REST :) (7认同)
  • 令人讨厌的HATEOAS包装器使我不再依赖spring-data-rest。我喜欢自动生成的服务接口,但不喜欢将响应包装在很多不必要的信息中而产生的麻烦,这些信息仅在我是自己的API的唯一客户端时才在开发时使用,但该信息会针对每个运行时请求。 (6认同)
  • 我想在后端使用 HATEOAS,但我无法理解这对于单页 javascript web 应用程序之类的内容如何(或者即使)有效。SDR 很有吸引力,因为它自动生成控制器,处理分页/排序,所有这些东西,而使用您所描述的基于 HTTP 的 JSON,我将不得不编写一堆控制器,将内容范围标头和查询参数等内容转换为Spring 数据存储库可以理解的东西。 (2认同)
  • 这是非常不满意的,但是你确实回答了我的问题. (2认同)
  • @gregturn:您是否意识到您的样本不使用 HATEOS,而是仅使用硬编码链接?))) (2认同)

Meg*_*dec 5

在阅读了Oliver的评论(我同意)之后,您仍然想从Spring Boot中删除HATEOAS。

在包含您的main方法的类的声明上方添加以下代码:

@SpringBootApplication(exclude = RepositoryRestMvcAutoConfiguration.class)
Run Code Online (Sandbox Code Playgroud)

正如Zack在评论中指出的那样,您还需要创建一个控制器,该控制器公开所需的REST方法(findAll,save,findById等)。

  • 这将完全停止SDR。 (8认同)
  • 如果您创建控制器来公开实体所需的 REST 方法,那么在依赖项中添加 Spring Data Rest 有何意义?最好从依赖项中删除 Spring Data Rest,而不是添加这个 @SpringBootApplication(exclude = RepositoryRestMvcAutoConfiguration.class)。 (2认同)