何时使用 @RestController 和 @RepositoryRestResource

97

我一直在查看使用Spring与REST的各种示例。 我们最终目标是一个Spring HATEOAS/HAL设置。

我看到了两种不同的方法来渲染RESTSpring中:

  1. 通过Controller中的@RestController

  2. 通过Repository中的@RepositoryRestResource

我无法找到的是,为什么要使用其中一种。在尝试实现HAL时哪个更好?

我们的数据库后端是Neo4j

4个回答

71

简单来说,您希望使用@RepositoryRestResource,因为它是使用Spring JPA创建一个HATEOAS服务。

如您所见这里将该注释添加到您的Pojo并链接它,您就拥有了一个完全功能的HATEOAS服务,无需实现存储库方法或REST服务方法。

如果您添加@RestController,则必须自己实现每个要公开的方法,并且它不会以HATEOAS格式导出此类信息。


7
默认情况下,Spring Data REST将导出所有顶层公共接口存储库。您只需要使用 @RepositoryRestResource 来不导出一个接口,或更改端点的详细信息。 - gregturn
4
如果您在Spring Data REST中使用RestController,那么您将绕过Spring Data REST提供的所有功能。如果要编写使用Spring Data REST的消息转换器等的自定义Spring MVC控制器,请查看BasePathAwareController。 - gregturn
我认为被采纳的答案不正确,@gregturn 的回答更好。 - Mark

42

你没有列出第三(和第四)个选项,即使用@BasePathAwareController或@RepositoryRestController,具体取决于您是否执行实体特定操作。

@RepositoryRestResource用于在公共存储库接口上设置选项-它将根据正在扩展的存储库类型(即CrudRepository / PagingAndSortingRepository等)自动创建适当的端点。

当您想要手动创建端点,但要使用您设置的Spring Data REST配置时,可以使用@BasePathAwareController和@RepositoryRestController。

如果您使用@RestController,则会创建一组平行的端点,具有不同的配置选项-即不同的消息转换器、不同的错误处理程序等-但它们将快乐地共存(并可能导致混淆)。

具体的文档可以在这里找到。


6
我认为这已经不再正确了。如果一个 @RestController 使用与 @RepositoryRestResource 相同的路径,仓库的端点将不会被创建。 - Hubert Grzeskowiak

23

以上答案在其上下文中都是正确的,但我为您提供一个实际的例子。

在许多情况下,作为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


如果这个解决方案有效,请点赞,我可以看到人们访问我的博客。 - shaILU

11

@RepositoryRestController可以覆盖Spring Data REST暴露的存储库生成的默认控制器。

为了利用Spring Data REST的设置、消息转换器、异常处理等功能,使用@RepositoryRestController注解而不是标准的Spring MVC @Controller@RestController

例如,这些控制器使用spring.data.rest.basePath Spring Boot设置作为路由的基本路径。

请参阅覆盖Spring Data REST响应处理程序

请注意添加@ResponseBody,因为它在@RepositoryRestController中被忽略了

如果您没有公开存储库(标记为@RepositoryRestResource(exported = false)),则应改用@BasePathAwareController注解

还要注意包

ControllerLinkBuilder不考虑Spring Data REST的基本路径,不应在类/类型级别上使用@RequestMapping

基本路径不显示在HAL中

解决链接问题的方法:https://dev59.com/lpDea4cB1Zd3GeqPWAYw#51736503

更新:最终我选择不使用@RepositoryRestController,因为需要使用很多变通方法。


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