何时使用 @RestController 与 @RepositoryRestResource
Posted
技术标签:
【中文标题】何时使用 @RestController 与 @RepositoryRestResource【英文标题】:When to use @RestController vs @RepositoryRestResource 【发布时间】:2014-05-14 12:38:12 【问题描述】:我一直在研究如何将 Spring 与 REST 结合使用的各种示例。我们的最终目标是 Spring HATEOAS/HAL
设置
我在 Spring
中看到了两种不同的渲染 REST 方法通过控制器内的@RestController
通过存储库中的@RepositoryRestResource
我正在努力寻找的是,你为什么要使用一个而不是另一个。在尝试实现 HAL
时,哪个最好?
我们的数据库后端是 Neo4j。
【问题讨论】:
【参考方案1】:好的,简而言之,您想使用@RepositoryRestResource
,因为这会使用Spring JPA 创建一个HATEOAS 服务。
如您所见here 添加此注释并将其链接到您的 Pojo,您将拥有一个功能齐全的 HATEOAS 服务,而无需实现存储库方法或 REST 服务方法
如果您添加 @RestController
,那么您必须自己实现每个要公开的方法,并且它不会将其导出为 HATEOAS 格式。
【讨论】:
默认情况下,Spring Data REST 将导出所有***的公共接口存储库。您只需要 @RepositoryRestResource 来不导出接口或更改端点的详细信息。 如果您将 RestController 与 Spring Data REST 一起使用,您将回避 Spring Data REST 提供的一切。要编写使用 Spring 数据 REST 的消息转换器等的自定义 Spring MVC 控制器,请查看 BasePathAwareController。 我认为接受的答案不正确@gregturn 有更好的答案。【参考方案2】:@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://***.com/a/51736503/548473
更新:由于有很多变通方法,最后我不想使用@RepositoryRestController
。
【讨论】:
【参考方案3】:嗯,上面的答案在他们的上下文中是正确的,我仍然给你一个实际的例子。
在许多场景中,作为 API 的一部分,我们需要提供端点来根据特定条件搜索实体。现在使用 JPA,您甚至不必编写查询,只需使用 Spring-JPA 的特定命名法创建一个接口和方法。要公开此类 API,您将创建服务层,它会简单地调用这些存储库方法,最后是控制器,它将通过调用服务层来公开端点。
Spring 在这里所做的,允许您从这些接口(存储库)公开这些端点,这些接口通常是对搜索实体的 GET 调用,并在后台生成必要的文件以创建最终端点。所以如果你使用@RepositoryRestResource 那么就不需要做Service/Controller层了。
另一方面,@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
【讨论】:
我可以看到人们访问我的博客,如果此解决方案有效,请投票。【参考方案4】:还有第三个(和第四个)您没有概述的选项,即使用@BasePathAwareController 或@RepositoryRestController,具体取决于您是否执行特定于实体的操作。
@RepositoryRestResource 用于在公共 Repository 接口上设置选项 - 它会根据正在扩展的 Repository 类型(即 CrudRepository/PagingAndSortingRepository/等)自动创建适当的端点。
@BasePathAwareController 和 @RepositoryRestController 在您想要手动创建端点但想要使用您已设置的 Spring Data REST 配置时使用。
如果您使用@RestController,您将创建一组具有不同配置选项的并行端点 - 即不同的消息转换器、不同的错误处理程序等 - 但它们将愉快地共存(并且可能导致混乱)。
具体文档可见here。
【讨论】:
我认为这不再是真的。如果@RestController
使用与@RepositoryRestResource
相同的路径,则不会创建存储库端点。以上是关于何时使用 @RestController 与 @RepositoryRestResource的主要内容,如果未能解决你的问题,请参考以下文章
注解@RestController与@Controller的区别