添加 link 到 Spring 数据 REST 存储库资源

Add link to Spring Data REST Repository resource

我想为 Spring 数据 REST 存储库中的资源创建一个 Link。我知道我们可以使用 ControllerLinkBuilder.linkTo 方法为 MVC 控制器创建 links。据我了解 Spring Data REST 从我们的 Repository 接口创建 MVC 控制器。但是如果我使用

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

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

当然我可以明确地创建 link,但我不想重复自己。

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

关于在不违反 DRY 原则的情况下我可以做些什么来解决这个问题的任何建议?

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

简而言之,以下代码可以解决问题。尽管如此,我还是很高兴听到其他人对此更有教养的意见!

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

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

entityLinks.linkToCollectionResource(TodoRepository.class) 对 spring - "give me the link to the TodoRepositories collection endpoint which would be something like 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);
        }
    }