不使用HATEOAS的Spring Data Rest

30

我非常喜欢Spring Data Rest为您编写的所有样板代码,但我更愿意有一个“普通”的REST服务器而不是所有HATEOAS的东西。主要原因是我在客户端使用Dojo Toolkit,它的所有小部件和存储都设置为返回只是一些项目的纯数组json,没有所有的链接和类似的东西。是否有人知道如何通过Java配置进行配置,以便我获得为我编写的所有MVC代码,但没有所有的HATEOAS内容?


1
你不能将REST响应映射到所需的格式吗?(晚评论:D) - Helder AC
2个回答

6

如果你已经阅读了奥利弗的评论(我同意他的观点),并且仍然想要从Spring Boot中移除HATEOAS。

请在包含主方法的类的声明之前添加以下内容:

@SpringBootApplication(exclude = RepositoryRestMvcAutoConfiguration.class)

如评论中由Zack指出的,你还需要创建一个控制器来公开所需的 REST 方法(findAll、save、findById 等)。


19
这将完全停止SDR。 - Adam
1
这应该是被接受的答案。除了这个注释,您还需要创建一个控制器,公开所需的REST方法(findAll、save、findById等)。 - Zack
因为添加了这个注释并手动创建了REST方法后,我得到了很多反对票,有人能解释一下他们的问题吗?我想知道这是不是已经过时了,还是人们只看了答案的一半。 - Megadec
2
如果您创建控制器来公开实体所需的REST方法,那么添加Spring Data Rest依赖项有什么意义呢?与其添加这个@ SpringBootApplication(exclude = RepositoryRestMvcAutoConfiguration.class),不如从依赖项中删除Spring Data Rest。 - Bằng
@Megadec,你提出的解决方案实际上与将Spring Data REST从依赖项中移除的效果完全相同。真的,试一试吧。你本质上是关闭了SDR。 - George Bezerra

6
所以您希望REST没有构成REST的因素? :) 我认为试图改变(即:简化)RESTful服务器以满足设计不良的客户端库是一个不好的开始。但是,除了可能熟悉的一般原理之外,这种工具的超媒体元素为什么是必要的的理由在这里。
将领域对象暴露给网络一直受到大多数REST社区的批评。主要原因是领域对象的边界并不一定是您想要给资源的边界。然而,提供脚手架功能的框架(Rails、Grails等)在过去几年中变得非常流行。因此,Spring Data REST试图解决这个空间,同时在restfulness方面成为一个好公民。
因此,如果您首先从一个简单的数据模型开始(没有太多关系的对象),只想读取它们,实际上就没有必要使用类似于Spring Data REST的东西。您需要编写的Spring控制器大致上是在Spring数据存储库的10行代码之上。当事情变得更具挑战性时,故事变得更有趣:
  • 如何编写客户端而不硬编码URI(如果是这样,它就不是特别restful)?
  • 如何处理资源之间的关系?如何让客户端创建它们、更新它们等等?
  • 客户端如何发现可用的查询资源?它如何找出要传递的参数等等?
如果您对这些问题的答案是:“我的客户端不需要那个/无法做到那个。”,那么Spring Data REST可能是错误的库。你基本上正在构建JSON over HTTP,但什么都不是真正的restful。如果这符合您的目的,那就完全没问题,但是将一个具有明确设计约束的库塞入任意不同(尽管表面上看起来相似)的东西中,实际上想要忽略这些设计方面,这是错误的方法。

2
我想在后端使用HATEOAS,但我很难理解它如何(甚至是否)适用于单页JavaScript Web应用程序之类的东西。SDR很有吸引力,因为它自动生成控制器,处理分页/排序等所有内容,而使用您描述的JSON over HTTP,则需要编写大量控制器,将诸如content-range标头和查询参数之类的内容转换为Spring Data存储库可以理解的内容。 - Matt
3
有点令人不满意,但你确实回答了我的问题。 - Matt
2
@gregturn:你有没有意识到你的示例并没有使用HATEOS,而是使用硬编码链接?))) - Vadim Ferderer
26
经过考虑,我得出结论认为SDR作者在这里过于教条主义了。用个比喻,这有点像正在生产无线电控制挖掘机的情况,即使用户抱怨在不使用无线电控制时天线真的妨碍到他们的使用,它们也不会创建一个允许用户移除无线电天线的机制。不幸的是,如果你建议用户采用另一种手动工具,这个比喻就不成立了。对于网络服务来说,情况确实没有那么简单。 - Adam
23
REST并不意味着HATEOAS或超媒体。它是一种定义从原始来源呈现数据责任的方法,基本上就是这样。即使遵循REST,JSON也不是一个假定的东西 :) - Maksim Gumerov
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接