何时使用@RestController vs @RepositoryRestResource

时间:2014-04-02 23:08:40

标签: spring spring-mvc spring-data spring-data-rest spring-hateoas

我一直在研究如何将Spring与REST结合使用的各种示例。我们的最终目标是Spring HATEOAS / HAL设置

我已经看到了两种在Spring中呈现REST的不同方法

  1. 通过控制器中的@RestController

  2. 通过存储库中的@RepositoryRestResource

  3. 我正在努力寻找的是你为什么要用一个而不是另一个。当试图实现最好的HAL时?

    我们的数据库后端是Neo4j。

4 个答案:

答案 0 :(得分:45)

好的,所以简短的故事就是你要使用@RepositoryRestResource,因为这会创建一个带有Spring JPA的HATEOAS服务。 正如您所看到here添加此注释并将其链接到您的Pojo,您可以获得功能齐全的HATEOAS服务,而无需实现存储库方法或REST服务方法

如果你添加@RestController,那么你必须实现你想要自己公开的每个方法,并且不会将它导出为HATEOAS格式

答案 1 :(得分:30)

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

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

@BasePathAwareController和@RepositoryRestController用于手动创建端点,但希望使用已设置的Spring Data REST配置。

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

可以找到具体文档here

答案 2 :(得分:12)

嗯,上面的答案在他们的背景下是正确的,我仍然给你实际的例子。

在许多情况下,作为API的一部分,我们需要提供端点,以便根据特定条件搜索实体。现在使用JPA,您甚至不必编写查询,只需使用Spring-JPA的特定术语创建一个接口和方法。要公开这样的API,您将创建Service层,它将简单地调用这些存储库方法,最后是Controllers,它将通过调用Service层来公开端点。

Spring在这里做了什么,允许您从这些接口(存储库)公开这些端点,这些接口通常是对搜索实体的GET调用,在后台生成必要的文件来创建最终端点。因此,如果您正在使用@RepositoryRestResource,则无需创建服务/控制器层。

另一方面,@ RestController是一个专门处理json数据和作为控制器休息工作的控制器。简而言之,@ 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

答案 3 :(得分:5)

@RepositoryRestController会从公开的存储库中覆盖默认生成的Spring Data REST控制器。

  

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

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

请参见Overriding Spring Data REST Response Handlers

请注意添加@ResponseBody中缺少的@RepositoryRestController

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

也请注意包包

ControllerLinkBuilder does not take Spring Data REST's base path into account and @RequestMapping shouldn't be used on class/type level

Base path doesn't show up in HAL

解决方法:修复链接:https://stackoverflow.com/a/51736503/548473

更新:由于很多解决方法,最后我不愿使用@RepositoryRestController