何时使用@RestController与@RepositoryRestResource


87

我一直在研究如何在REST中使用Spring的各种示例。我们的最终目标是HATEOAS/HAL安装Spring

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

  1. 通过@RestController控制器内

  2. 通过@RepositoryRestResource存储库中

我在努力寻找的是为什么您会使用一个而不是另一个。尝试实施HAL哪种方法最好?

我们的数据库后端是Neo4j

Answers:


61

好的,因为您使用Spring JPA@RepositoryRestResource创建了HATEOAS服务,所以简短地说

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

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


7
默认情况下,Spring Data REST将导出所有顶级的公共接口存储库。您只需要@RepositoryRestResource即可不导出接口或更改端点的详细信息。
gregturn

4
如果将RestController与Spring Data REST一起使用,您将回避Spring Data REST提供的一切。要编写使用Spring数据REST的消息转换器等的自定义Spring MVC控制器的代码,请查看BasePathAwareController。
gregturn

我认为接受的答案不是正确的@gregturn有更好的答案。
2015年

39

您尚未概述的第三个(第四个)选项是使用@BasePathAwareController或@RepositoryRestController,具体取决于您是否执行特定于实体的操作。

@RepositoryRestResource用于在公共存储库界面上设置选项-它会根据要扩展的存储库类型(即CrudRepository / PagingAndSortingRepository / etc)自动根据需要自动创建端点。

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

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

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


6
我认为这不再是事实。如果a@RestController使用与相同的路径@RepositoryRestResource,则不会创建存储库端点。
Hubert Grzeskowiak

19

好了,以上答案在它们的上下文中是正确的,我还是在给您一些实际的例子。

在许多情况下,作为API的一部分,我们需要提供用于根据某些条件搜索实体的端点。现在,使用JPA,您甚至不必编写查询,只需使用Spring-JPA的特定术语创建一个接口和方法。为了公开这样的API,您将创建Service层,它将简单地调用这些存储库方法,最后是Controllers,将通过调用Service层公开端点。

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 -休眠无控制器


我可以看到有人去我的博客,如果该解决方案有效,请投票。
shaILU

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由于很多解决方法,最后我不愿使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.