Когда использовать @RestController vs @RepositoryRestResource
Я рассматривал различные примеры того, как использовать весну с отдыхом. Наша конечная цель-Установка Spring HATEOAS / HAL
Я видел два различных метода для рендеринга отдыха в течение весны
через
@RestControllerв контроллеречерез
@RepositoryRestResourceв репозитории
то, что я изо всех сил пытаюсь найти, почему бы вам использовать один над другим. При попытке реализовать HAL, который является лучше всего?
бэкэнд нашей базы данных-Neo4j.
4 ответов:
Итак, короткая история заключается в том, что вы хотите использовать @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 как a контроллер. Короче говоря @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переопределить созданные по умолчанию контроллеры REST данных Spring из открытого репозитория.чтобы воспользоваться настройками Spring Data REST, конвертерами сообщений, обработкой исключений и т. д., Используйте
@RepositoryRestControllerаннотация вместо стандартной пружины MVC@Controllerили@RestControllerнапример, эти контроллеры используют
spring.data.rest.basePathSpring Boot настройка в качестве базового пути для маршрутизации.посмотреть переопределяя ответ остальных данных весны Обработчики.
будьте в курсе добавления
@ResponseBodyкак это пропустили в@RepositoryRestControllerесли вы не выставили репозиторий (помечен как
@RepositoryRestResource(exported = false)), используйте аннотациитакже имейте в виду сумки
и
базовый путь не отображается в Хэл
обходной путь для исправления ссылки:https://stackoverflow.com/a/51736503/548473
Comments