93

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

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

  1. 通过@RestController控制器内

  2. 通过@RepositoryRestResource存储库中

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

我们的数据库后端是Neo4j

4

4 回答 4

68

好的,所以简短的故事是您想要使用,因为这会使用Spring JPA@RepositoryRestResource创建HATEOAS服务。

正如您在此处看到的,添加此注释并将其链接到您的 Pojo,您就拥有了一个功能齐全的HATEOAS服务,而无需实现存储库方法或 REST 服务方法

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

于 2014-04-20T13:46:14.660 回答
40

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

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

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

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

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

于 2015-11-10T18:23:10.253 回答
22

好吧,上面的答案在他们的上下文中是正确的,我仍然给你一个实际的例子。

在许多场景中,作为 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 -休眠-无控制器

于 2015-12-03T08:41:24.143 回答
10

@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更新:由于有很多变通方法,最后我不喜欢使用。

于 2018-08-07T14:22:59.167 回答