Kiedy używać @RestController, a kiedy @RepositoryRestResource


87

Przyglądałem się różnym przykładom wykorzystania Springa z REST . Naszym celem końcowym jest HATEOAS/HALkonfiguracja wiosenna

Widziałem dwie różne metody renderowania REST w Spring

  1. Za @RestControllerpośrednictwem kontrolera

  2. Przez @RepositoryRestResourcew repozytorium

Staram się znaleźć, dlaczego miałbyś używać jednego nad drugim. Kiedy próbujesz wdrożyć, HALco jest najlepsze?

Nasza baza danych to Neo4j .

Odpowiedzi:


61

Ok, więc krótka historia jest taka, że ​​chcesz użyć, @RepositoryRestResourceponieważ tworzy to usługę HATEOAS z Spring JPA .

Jak widzisz tutaj dodając tę ​​adnotację i łącząc ją z Twoim Pojo masz w pełni funkcjonalną usługę HATEOAS bez konieczności implementowania metody repozytorium lub metod usługi REST

Jeśli dodasz @RestController, musisz zaimplementować każdą metodę, którą chcesz ujawnić samodzielnie, a także nie eksportuje ona tego do formatu HATEOAS .


7
Domyślnie Spring Data REST eksportuje WSZYSTKIE repozytoria publicznego interfejsu najwyższego poziomu. @RepositoryRestResource potrzebujesz tylko, aby NIE wyeksportować interfejsu lub zmienić szczegóły punktu końcowego.
— gregturn

4
Jeśli używasz RestController z Spring Data REST, ominiesz WSZYSTKO, co zapewnia Spring Data REST. Aby zakodować niestandardowy kontroler Spring MVC, który używa konwerterów komunikatów Spring Data REST itp., Zajrzyj do BasePathAwareController.
— gregturn

Nie sądzę, aby zaakceptowana odpowiedź była poprawna, @gregturn ma lepszą odpowiedź.
— Mark

39

Istnieje trzecia (i czwarta) opcja, której nie opisałeś, czyli użycie @BasePathAwareController lub @RepositoryRestController, w zależności od tego, czy wykonujesz akcje specyficzne dla jednostki, czy nie.

@RepositoryRestResource służy do ustawiania opcji w publicznym interfejsie repozytorium - automatycznie utworzy odpowiednie punkty końcowe w oparciu o typ rozszerzanego repozytorium (tj. CrudRepository / PagingAndSortingRepository / etc).

@BasePathAwareController i @RepositoryRestController są używane, gdy chcesz ręcznie tworzyć punkty końcowe, ale chcesz użyć skonfigurowanych konfiguracji Spring Data REST.

Jeśli użyjesz @RestController, utworzysz równoległy zestaw punktów końcowych z różnymi opcjami konfiguracji - np. Inny konwerter komunikatów, różne procedury obsługi błędów itp. - ale szczęśliwie będą współistnieć (i prawdopodobnie spowodują zamieszanie).

Szczegółową dokumentację można znaleźć tutaj .


6
Myślę, że to już nie prawda. Jeśli a @RestControllerużywa tej samej ścieżki co a @RepositoryRestResource, punkty końcowe repozytorium nie zostaną utworzone.
— Hubert Grzeskowiak

19

Cóż, powyższe odpowiedzi są poprawne w ich kontekście, ale daję ci praktyczny przykład.

W wielu scenariuszach w ramach API musimy zapewnić punkty końcowe do wyszukiwania encji na podstawie określonych kryteriów. Teraz używając JPA nie musisz nawet pisać zapytań, po prostu stwórz interfejs i metody z określoną nomenklaturą Spring-JPA. Aby udostępnić takie interfejsy API, utworzysz warstwę usług, która po prostu wywoła te metody repozytorium, a na końcu kontrolery, które ujawnią punkty końcowe, wywołując warstwę usług.

To, co zrobiła tutaj Spring, pozwoliło na ujawnienie tych punktów końcowych z takich interfejsów (repozytoriów), które są zwykle wywołaniami GET do wyszukiwania encji, aw tle generuje pliki niezbędne do utworzenia końcowych punktów końcowych. Więc jeśli używasz @RepositoryRestResource, nie ma potrzeby tworzenia warstwy usługi / kontrolera.

Z drugiej strony @RestController to kontroler, który zajmuje się konkretnie danymi json i resztą działa jako kontroler. W skrócie @Controller + @ResponseBody = @RestController.

Mam nadzieję że to pomoże.

Zobacz mój przykład roboczy i blog dla tego samego:
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with -hibernate-no-controller


Widzę ludzi wchodzących na mojego bloga, jeśli to rozwiązanie zadziała, proszę o głosowanie.
— shaILU

10

@RepositoryRestController nadpisuje domyślne generowane kontrolery Spring Data REST z udostępnionego repozytorium.

Aby skorzystać z ustawień Spring Data REST, konwerterów wiadomości, obsługi wyjątków i nie tylko, użyj @RepositoryRestControlleradnotacji zamiast standardowego Spring MVC @Controllerlub@RestController

Np. Te kontrolery używają spring.data.rest.basePathustawienia Spring Boot jako ścieżki bazowej dla routingu.

Zobacz Przesłanianie programów obsługi odpowiedzi REST danych Spring .

Pamiętaj o dodawaniu, @ResponseBodyponieważ jest pomijane w@RepositoryRestController

Jeśli nie ujawniłeś repozytorium (oznaczonego jako @RepositoryRestResource(exported = false)), użyj @BasePathAwareControllerzamiast tego adnotacji

Uważaj również na torby

ControllerLinkBuildernie bierze pod uwagę ścieżki bazowej Spring Data REST i @RequestMappingnie powinien być używany na poziomie klasy / typu

i

Ścieżka podstawowa nie pojawia się w HAL

Obejście problemu z linkiem: https://stackoverflow.com/a/51736503/548473

AKTUALIZACJA: w końcu wolę nie używać @RepositoryRestControllerze względu na wiele obejść.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.