我一直在研究如何将 Spring 与REST结合使用的各种示例。我们的最终目标是 SpringHATEOAS/HAL
设置
我已经看到了在Spring中呈现REST的两种不同方法
通过
@RestController
控制器内通过
@RepositoryRestResource
存储库中
我正在努力寻找的是你为什么要使用一个而不是另一个。当试图实施HAL
哪个是最好的?
我们的数据库后端是Neo4j。
我一直在研究如何将 Spring 与REST结合使用的各种示例。我们的最终目标是 SpringHATEOAS/HAL
设置
我已经看到了在Spring中呈现REST的两种不同方法
通过@RestController
控制器内
通过@RepositoryRestResource
存储库中
我正在努力寻找的是你为什么要使用一个而不是另一个。当试图实施HAL
哪个是最好的?
我们的数据库后端是Neo4j。
好的,所以简短的故事是您想要使用,因为这会使用Spring JPA@RepositoryRestResource
创建HATEOAS服务。
正如您在此处看到的,添加此注释并将其链接到您的 Pojo,您就拥有了一个功能齐全的HATEOAS服务,而无需实现存储库方法或 REST 服务方法
如果您添加,@RestController
那么您必须实现您想要自己公开的每个方法,并且它不会将其导出为HATEOAS格式。
您还没有概述第三个(和第四个)选项,即使用@BasePathAwareController 或@RepositoryRestController,具体取决于您是否正在执行特定于实体的操作。
@RepositoryRestResource 用于在公共 Repository 接口上设置选项 - 它会根据正在扩展的 Repository 的类型(即 CrudRepository/PagingAndSortingRepository/等)自动创建适当的端点。
@BasePathAwareController 和 @RepositoryRestController 在您想要手动创建端点但想要使用您设置的 Spring Data REST 配置时使用。
如果您使用@RestController,您将创建一组具有不同配置选项的并行端点——即不同的消息转换器、不同的错误处理程序等——但它们将愉快地共存(并可能导致混淆)。
具体的文档可以在这里找到。
好吧,上面的答案在他们的上下文中是正确的,我仍然给你一个实际的例子。
在许多场景中,作为 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 -休眠-无控制器
@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
不应在类/类型级别上使用
和
修复链接的解决方法:https ://stackoverflow.com/a/51736503/548473
@RepositoryRestController
更新:由于有很多变通方法,最后我不喜欢使用。