添加指向Spring Data REST Repository资源的链接

时间:2015-08-20 09:10:45

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

我想在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原则的任何建议?

2 个答案:

答案 0 :(得分:10)

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

简而言之,以下代码可以解决问题。尽管如此,我很高兴听到另一个人对此有更多的教育意见!

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

答案 1 :(得分:2)

如果有人对如何将它们拼凑起来感到困惑,则需要将RepsitoryEntityLinks注入控制器中。注意不需要AutoWired,因为如果只有1个构造函数,spring会自动注入值。

entityLinks.linkToCollectionResource(TodoRepository.class)说春天 - “给我链接到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);
        }
    }