何时使用 @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的主要内容,如果未能解决你的问题,请参考以下文章

R语言如何和何时使用glmnet岭回归

restController与Controller-待续

注解@RestController与@Controller的区别

何时使用 `raise_for_status` 与 `status_code` 测试

@RestController注解下返回到jsp视图页面

@RestController注解下返回到jsp视图页面