Когда использовать @RestController vs @RepositoryRestResource

Я рассматривал различные примеры того, как использовать весну с отдыхом. Наша конечная цель-Весенняя установка HATEOAS/HAL

Я видел два разных метода рендеринга REST в Spring

  1. Via @RestController в контроллере

  2. Via @RepositoryRestResource в репозитории

то, что я изо всех сил пытаюсь найти, - это то, почему вы используете один над другим. При попытке реализовать HAL, который лучший?

наша база данных бэкэнд Neo4j.

4 ответов


Ok Итак, короткая история заключается в том, что вы хотите использовать @RepositoryRestResource, так как это создает службу HATEOAS с Spring JPA. Как видите здесь добавление этой аннотации и связывание ее с Pojo у вас есть полностью функциональный сервис HATEOAS без необходимости реализации метода репозитория или методов службы REST

Если вы добавляете @RestController, то вам нужно реализовать каждый метод, который вы хотите предоставить самостоятельно, а также не экспортировать это в формате HATEOAS


есть третий (и четвертый) вариант, который вы не описали, который должен использовать либо @BasePathAwareController, либо @RepositoryRestController, в зависимости от того, выполняете ли вы действия для конкретной сущности или нет.

@RepositoryRestResource используется для установки параметров в интерфейсе публичного репозитория - он автоматически создает конечные точки в зависимости от типа расширяемого репозитория (т. е. CrudRepository / PagingAndSortingRepository / etc).

@BasePathAwareController и @RepositoryRestController используются, когда вы хотите вручную создать конечные точки, но хотите использовать конфигурации Spring Data REST, которые вы настроили.

Если вы используете @RestController, вы создадите параллельный набор конечных точек с разные параметры конфигурации-т. е. другой конвертер сообщений, разные обработчики ошибок и т. д.-Но они будут счастливо сосуществовать (и вероятно, вызывают путаницу).

можно найти конкретную документацию здесь.


Ну, выше ответы верны в их контексте, но я все же даю вам практический пример.

во многих сценариях как часть API нам нужно предоставить конечные точки для поиска сущности на основе определенных критериев. Теперь, используя JPA, вам не нужно даже писать запросы, просто сделайте интерфейс и методы с определенной номенклатурой Spring-JPA. Чтобы выставить такие API, вы создадите уровень сервиса, который просто вызовет эти методы репозитория и, наконец, контроллеры, которые будут выставьте конечные точки, вызвав уровень сервиса.

то, что Spring сделал здесь, позволяет вам выставлять эти конечные точки из таких интерфейсов (репозиториев), которые обычно получают вызовы для поиска сущности и в фоновом режиме генерируют необходимые файлы для создания конечных конечных точек. Поэтому, если вы используете @RepositoryRestResource, нет необходимости создавать уровень сервиса/контроллера.

с другой стороны @RestController-это контроллер, который специально занимается данными json, а rest работает как контроллер. Короче говоря, @Controller + @ResponseBody = @RestController.

надеюсь, что это помогает.

см. мой рабочий пример и блог для того же:
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with-hibernate-no-controller


@RepositoryRestController переопределить созданные по умолчанию контроллеры Spring Data REST из открытого репозитория.

чтобы воспользоваться настройками Spring Data REST, преобразователями сообщений, обработкой исключений и т. д., Используйте @RepositoryRestController аннотация вместо стандартного Spring MVC @Controller или @RestController

например, это контроллеры используют spring.data.rest.basePath настройка Spring Boot в качестве базового пути для маршрутизации.

посмотреть Overriding ответ остальных данных по весны Обработчики.

помните о добавлении @ResponseBody как это пропустили в @RepositoryRestController

если вы не выставили репозиторий (отмечен как @RepositoryRestResource(exported = false)), используйте аннотации

также имейте в виду сумки

ControllerLinkBuilder не учитывает базовый путь Spring Data REST и @RequestMapping не следует использовать на уровне класса / типа

и

базовый путь не отображается в Хэл!--21-->

обходной путь для исправления ссылки:https://stackoverflow.com/a/51736503/548473