我想在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原则的任何建议?
答案 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);
}
}