添加到Spring Data REST Repository资源的链接



我想创建一个到Spring Data REST存储库中的资源的链接。我知道,我们可以使用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(没有Repository路径)。如果我在Repository中使用@RepositoryRestResource显式指定路径,则不会改变任何内容。

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

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

在不违反DRY原则的情况下,我能做些什么来解决这个问题?

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

简单地说,下面的代码完成了这个任务。尽管如此,我还是很高兴听到另一个更有教养的人对此的看法!
Link link = entityLinks.linkToSingleResource(InstanceRepository.class, 1L);

如果有人对如何将其拼凑在一起感到困惑,则需要像这样将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);
        }
    }

最新更新