我想创建一个到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);
}
}