【问题标题】:Add link to Spring Data REST Repository resource添加指向 Spring Data REST Repository 资源的链接
【发布时间】:2015-11-13 20:28:27
【问题描述】:

我想创建一个指向 Spring Data REST Repository 中资源的链接。我知道我们可以使用ControllerLinkBuilder.linkTo 方法来创建指向 MVC 控制器的链接。据我所知,Spring Data REST 从我们的 Repository 接口创建 MVC 控制器。但是如果我使用

Instance createdInstance = instanceRepository.save(instance);
Link link = linkTo(InstanceRepository.class).slash(createdInstance.getId()).withSelfRel();

要创建链接,我只需得到http://localhost:8080/2(没有存储库路径)。如果我在存储库中使用 @RepositoryRestResource 明确指定路径,则没有任何变化。

当然我可以直接创建链接,但我不想重复自己。

public interface InstanceRepository extends CrudRepository<Instance, Long> {
}

有什么建议可以在不违反 DRY 原则的情况下解决这个问题吗?

【问题讨论】:

    标签: spring-mvc spring-data-rest spring-hateoas


    【解决方案1】:

    通过 Spring Data REST 源代码搜索,我找到了在框架中使用的类 RepositoryEntityLinks。它有一个非常讨厌的构造函数,但是(至少在我的项目中)我可以 @Autowire 类。

    简而言之,以下代码可以解决问题。不过,我很高兴听到其他人对此有更受过教育的意见!

    Link link = entityLinks.linkToSingleResource(InstanceRepository.class, 1L);
    

    【讨论】:

    • 没什么可添加的,除了即将发布的 2.4.0 版本将在参考文档中明确提及(详见DATAREST-623)。
    • 我无法在我的ResourceAssemblerSupport 班级内@Autowire RepositoryEntityLinks。你是@Autowiring@RestController 中吗?
    • 对于关系 OneToMany,当我想要嵌套对象的所有链接时?
    【解决方案2】:

    如果有人对如何将它们拼凑在一起感到困惑,您需要像这样将RepsitoryEntityLinks 注入您的控制器。请注意,不需要AutoWired,因为如果只有 1 个构造函数,spring 会自动注入值。

    entityLinks.linkToCollectionResource(TodoRepository.class) 对 spring 说 - “给我 TodoRepositories 集合端点的链接,类似于 localhost:8080/api/todos

        @RestController
        @RequestMapping(value="/api")
        public class PriorityController {
    
            private RepositoryEntityLinks entityLinks;
    
            public PriorityController(RepositoryEntityLinks entityLinks) {
                this.entityLinks = entityLinks;
            }
    
            @GetMapping(value = "/priorities", produces = MediaTypes.HAL_JSON_VALUE)
            public ResponseEntity<Resources<Priority>> getPriorities() {
               Link link = entityLinks.linkToCollectionResource(TodoRepository.class);
               resources.add(link);
               return ResponseEntity.ok(resources);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 2014-12-10
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 2018-09-04
      • 2020-01-15
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多