Как смешивать Spring Хранилища данных и Spring Контроллеры останова
В настоящее время я размещаю несколько репозиториев данных Spring как службы RESTful, аннотируя их с помощью @RepositoryRestResource следующим образом:
@RepositoryRestResource(collectionResourceRel = "thing1", path = "thing1")
public interface Thing1Repository extends PagingAndSortingRepository<Thing1, String> {}
@RepositoryRestResource(collectionResourceRel = "thing2", path = "thing2")
public interface Thing2Repository extends CrudRepository<Thing2, String> {}
Все это прекрасно работает. Когда вы нажмете на мою первую конечную точку, также отображаются все Spring Хранилища данных, которые я выставил, например:
{
_links: {
thing1: {
href: "http://localhost:8080/thing1{?page,size,sort}",
templated: true
},
thing2: {
href: "http://localhost:8080/thing2"
}
}
}
Теперь у меня есть некоторые конечные точки, которые я хочу открыть, которые не могут быть представлены Spring Хранилищами данных, поэтому я использую RestController.
Вот простой пример:
@RestController
@ExposesResourceFor(Thing3.class)
@RequestMapping("/thing3")
public class Thing3Controller {
@Autowired
EntityLinks entityLinks;
@Autowired
Thing3DAO thing3DAO;
//just assume Thing3.class extends ResourceSupport. I know this is wrong, but it makes the example shorter
@RequestMapping(value = "/{id}", produces = "application/json")
Thing3 thing3(@PathVariable("id") String id)
{
Thing3 thing3 = thing3DAO.findOne(id);
Link link = entityLinks.linkToSingleResource(Thing3.class, id);
thing3.add(link);
return thing3;
}
}
Теперь, если я запустил это приложение и перешел к:
http://localhost:8080/thing3/{id}
Я получаю JSON-представление Thing3 со ссылкой на себя, которая работает так, как ожидалось.
Что я хочу понять, как сделать, так это то, что первая конечная точка также описывает этот контроллер. Я в основном хочу этого:
{
_links: {
thing1: {
href: "http://localhost:8080/thing1{?page,size,sort}",
templated: true
},
thing2: {
href: "http://localhost:8080/thing2"
},
thing3: {
href: "http://localhost:8080/thing3"
}
}
}
Что мне нужно сделать, чтобы моя базовая конечная точка имела ссылку на этот контроллер?
Ответы
Ответ 1
Вы можете переопределить RepositoryLinkResource и добавить ресурс, указывающий на вашу вещь3:
resource.add(ControllerLinkBuilder.linkTo(Thing3Controller.class).withRel("thing3"));
Отметьте этот вопрос: Пользовательский ответ для запроса root int Spring REST HATEOAS с помощью как RepositoryRestResource, так и обычных контроллеров