何时使用@RestController vs @RepositoryRestResource

cod*_*ode 79 spring spring-mvc spring-data spring-data-rest spring-hateoas

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

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

  1. 通过HATEOAS/HAL控制器内部

  2. 通过@RestController存储库中的内容

我正在努力寻找的是你为什么要使用一个而不是另一个.在尝试实施HAL时哪个最好?

我们的数据库后端是Neo4j.

zpo*_*kas 54

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

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

  • 默认情况下,Spring Data REST将导出所有顶级公共接口存储库.您只需要@RepositoryRestResource来导出接口,或者更改端点的详细信息. (7认同)
  • 如果您将RestController与Spring Data REST一起使用,那么您将回避Spring Data REST提供的所有功能.要编写使用Spring数据REST的消息转换器等的自定义Spring MVC控制器,请查看BasePathAwareController. (4认同)

小智 34

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

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

如果要手动创建端点,但希望使用已设置的Spring Data REST配置,则使用@BasePathAwareController和@RepositoryRestController.

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

具体文档可在此处找到.

  • 我认为这不再是真的.如果`@ RestController`使用与`@RepositoryRestResource`相同的路径,则不会创建存储库端点. (6认同)

sha*_*ILU 16

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

在许多情况下,作为API的一部分,我们需要提供基于特定标准搜索实体的端点.现在使用JPA,您甚至不必编写查询,只需使用Spring-JPA的特定术语创建一个接口和方法.要公开这样的API,您将创建Service层,它将简单地调用这些存储库方法,最后是控制器,它将通过调用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-控制器


GKi*_*lin 8

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

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

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

请参阅重写Spring Data REST响应处理程序

注意添加,@ResponseBody因为它错过了@RepositoryRestController

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

也要注意包包

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

基本路径未在HAL中显示

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

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