我一直在查看使用Spring与REST的各种示例。 我们最终目标是一个Spring HATEOAS/HAL
设置。
我看到了两种不同的方法来渲染REST在Spring中:
通过Controller中的
@RestController
通过Repository中的
@RepositoryRestResource
我无法找到的是,为什么要使用其中一种。在尝试实现HAL
时哪个更好?
我们的数据库后端是Neo4j。
我一直在查看使用Spring与REST的各种示例。 我们最终目标是一个Spring HATEOAS/HAL
设置。
我看到了两种不同的方法来渲染REST在Spring中:
通过Controller中的@RestController
通过Repository中的@RepositoryRestResource
我无法找到的是,为什么要使用其中一种。在尝试实现HAL
时哪个更好?
我们的数据库后端是Neo4j。
简单来说,您希望使用@RepositoryRestResource
,因为它是使用Spring JPA创建一个HATEOAS服务。
如您所见这里将该注释添加到您的Pojo并链接它,您就拥有了一个完全功能的HATEOAS服务,无需实现存储库方法或REST服务方法。
如果您添加@RestController
,则必须自己实现每个要公开的方法,并且它不会以HATEOAS格式导出此类信息。
你没有列出第三(和第四)个选项,即使用@BasePathAwareController或@RepositoryRestController,具体取决于您是否执行实体特定操作。
@RepositoryRestResource用于在公共存储库接口上设置选项-它将根据正在扩展的存储库类型(即CrudRepository / PagingAndSortingRepository等)自动创建适当的端点。
当您想要手动创建端点,但要使用您设置的Spring Data REST配置时,可以使用@BasePathAwareController和@RepositoryRestController。
如果您使用@RestController,则会创建一组平行的端点,具有不同的配置选项-即不同的消息转换器、不同的错误处理程序等-但它们将快乐地共存(并可能导致混淆)。
具体的文档可以在这里找到。
@RestController
使用与 @RepositoryRestResource
相同的路径,仓库的端点将不会被创建。 - Hubert Grzeskowiak以上答案在其上下文中都是正确的,但我为您提供一个实际的例子。
在许多情况下,作为API的一部分,我们需要基于某些标准提供搜索实体的端点。现在使用JPA,你甚至不需要编写查询,只需创建一个带有Spring-JPA特定命名约定的接口和方法即可。为了暴露这样的API,你将创建一个Service层,它将简单地调用这些repository方法,最终Controller将通过调用Service层来公开端点。
Spring在这里所做的是允许你从这些界面(repositories)公开这些端点,这些端点通常是GET调用以搜索实体,并在后台生成必要的文件以创建最终端点。因此,如果你正在使用@RepositoryRestResource,则无需创建Service/Controller层。
另一方面,@RestController是一个专门处理json数据和rest工作的控制器。简而言之,@Controller + @ResponseBody = @RestController。
希望这会有所帮助。
查看我的工作示例和相关博客:
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with-hibernate-no-controller
@RepositoryRestController
可以覆盖Spring Data REST暴露的存储库生成的默认控制器。
为了利用Spring Data REST的设置、消息转换器、异常处理等功能,使用
@RepositoryRestController
注解而不是标准的Spring MVC@Controller
或@RestController
例如,这些控制器使用spring.data.rest.basePath
Spring Boot设置作为路由的基本路径。
请注意添加@ResponseBody
,因为它在@RepositoryRestController
中被忽略了
如果您没有公开存储库(标记为@RepositoryRestResource(exported = false)
),则应改用@BasePathAwareController
注解
还要注意包
ControllerLinkBuilder
不考虑Spring Data REST的基本路径,不应在类/类型级别上使用@RequestMapping
和
解决链接问题的方法:https://dev59.com/lpDea4cB1Zd3GeqPWAYw#51736503
更新:最终我选择不使用@RepositoryRestController
,因为需要使用很多变通方法。