2015-08-20 3 views
2

Я хочу создать ссылку на ресурс в репозитории REST данных Spring. Я знаю, что мы можем использовать метод ControllerLinkBuilder.linkTo для создания ссылок на контроллеры MVC. Насколько я понимаю, Spring Data REST создает MVC-контроллеры из наших интерфейсов репозитория. Но если я используюДобавить ссылку на Spring Data REST Ресурс репозитория

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

создать ссылку, я просто получить http://localhost:8080/2 (без Repository пути). Ничего не меняется, если я укажу путь явно с помощью @RepositoryRestResource в репозитории.

Конечно, я мог бы просто создать ссылку явно, но я не хочу повторять сам.

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

Любые советы относительно того, что я мог бы сделать для решения этой проблемы, не нарушая принципов СУХОЙ?

ответ

8

Поиск через исходный код источника данных Spring Data Я нашел класс RepositoryEntityLinks, который используется в рамках. У этого есть довольно неприятный конструктор, но (по крайней мере в моем проекте) я могу @Autowire класса.

Вкратце, следующий код делает трюк. Тем не менее, я был бы рад услышать об этом еще более образованное мнение!

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

добавить нечего, кроме того, что предстоящая версия 2.4.0 будет отметить, что в (см. [DATAREST-623] (https://jira.spring.io/browse/DATAREST-623) для получения дополнительной информации). –

+0

Очень полезно, спасибо! – aglassman

+0

Я не могу '@ Autowire'' RepositoryEntityLinks' внутри моего класса ResourceAssemblerSupport. Вы '@ Autowiring' в' @ RestController'? –

1

Если кто-то запутался о том, как собрать все это вместе, вы должны вводить RepsitoryEntityLinks в контроллер, как это. Примечание: AutoWired необходимо, так как весна будет автоматически вводить значения, если они являются только конструктором 1.

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); 
     } 
    } 
Смежные вопросы