Próbuję połączyć mvc i resztę w jednym projekcie buta sprężynowego.
Chcę ustawić ścieżkę bazową dla wszystkich pozostałych kontrolerów (np. Example.com/api) w jednym miejscu (nie chcę @RequestMapping('api/products')
zamiast tego przypisywać do każdego kontrolera adnotacji po prostu @RequestMapping('/products')
.
Dostęp do kontrolerów MVC powinien być możliwy pod adresem example.com/cokolwiek
Czy to możliwe?
(Nie używam sprężynowej podpórki danych, tylko sprężynowe MVC)
java
spring
rest
spring-boot
spring-mvc
Teimuraz
źródło
źródło
Odpowiedzi:
W przypadku Spring Boot 1.2+ (<2.0) wystarczy jedna właściwość w application.properties:
odnośnik: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri
W przypadku wersji 2.x użyj
źródło
Trochę późno, ale to samo pytanie przywiodło mnie tutaj, zanim dotarłem do odpowiedzi, więc zamieszczam je tutaj. Utwórz (jeśli nadal go nie masz) plik application.properties i dodaj
Więc w poprzednim przykładzie, jeśli masz RestController,
@RequestMapping("/test")
uzyskasz do niego dostęp jaklocalhost:8080/api/test/{your_rest_method}
źródło pytania: jak wybrać adres URL mojej aplikacji webowej rozruchowej wiosny
źródło
Do wersji szkieletowej do butów sprężynowych
2.0.4.RELEASE+
. Dodaj tę linię doapplication.properties
źródło
spring.data.rest.basePath
nie działa dla Spring boot 2Ponieważ jest to pierwsze trafienie Google dotyczące problemu i zakładam, że więcej osób będzie tego szukało. Pojawiła się nowa opcja od wersji Spring Boot „1.4.0”. Można teraz zdefiniować niestandardowy RequestMappingHandlerMapping, który pozwala zdefiniować inną ścieżkę dla klas z adnotacją @RestController
Inną wersję z niestandardowymi adnotacjami, która łączy @RestController z @RequestMapping, można znaleźć w tym poście na blogu
źródło
Nie mogłem uwierzyć, jak skomplikowana jest odpowiedź na to pozornie proste pytanie. Oto kilka odniesień:
Należy wziąć pod uwagę wiele różnych kwestii:
server.context-path=/api
wapplication.properties
, możesz skonfigurować prefiks dla wszystkiego (jego server.context-path, a nie server.contextPath!)spring.data.rest.base-path
wapplication.properties
. Ale zwykły@RestController
nie weźmie tego pod uwagę. Zgodnie z dokumentacją danych sprężynowych istnieje adnotacja@BasePathAwareController
, której można użyć do tego. Ale mam problemy w związku z zabezpieczeniami Springa, kiedy próbuję zabezpieczyć taki kontroler. Już go nie znaleziono.Innym obejściem jest prosta sztuczka. Nie możesz poprzedzić statycznego ciągu znaków w adnotacji, ale możesz użyć takich wyrażeń:
źródło
W przypadku Boot 2.0.0+ działa to dla mnie: server.servlet.context-path = / api
źródło
Znalazłem czyste rozwiązanie, które dotyczy tylko odpoczynku kontrolerów.
Spring boot zarejestruje dwa serwlety dyspozytorskie - domyślnie
dispatcherServlet
dla kontrolerów irestApi
dyspozytora dla@RestControllers
zdefiniowanych wrest.xml
:Przykład
rest.xml
:Ale nie jesteś ograniczony do :
XmlWebApplicationContext
, możesz użyć dowolnego innego dostępnego typu kontekstu, tj.AnnotationConfigWebApplicationContext
,GenericWebApplicationContext
,GroovyWebApplicationContext
, ...jsonMessageConverter
,messageConverters
fasola w kontekście spoczynku, mogą być zdefiniowane w kontekście nadrzędnymźródło
Możesz utworzyć niestandardową adnotację dla swoich kontrolerów:
Użyj go zamiast zwykłego @RestController w klasach kontrolera i dodaj adnotacje za pomocą @RequestMapping.
Właśnie przetestowane - działa w Spring 4.2!
źródło
RequestMappingHandlerMapping
. Spring Data REST ma mapper podobny do tego, czego potrzebujesz -BasePathAwareHandlerMapping
.Mogę się trochę spóźnić, ALE ... Uważam, że to najlepsze rozwiązanie. Ustaw to w pliku application.yml (lub analogicznym pliku konfiguracyjnym):
O ile pamiętam, to wszystko - wszystkie twoje repozytoria zostaną ujawnione pod tym identyfikatorem URI.
źródło
spring.data.rest.base-path
ma wpływ tylko na odpoczynek danych wiosennych i nienawiść wiosennych. Zwykły @RestController nadal będzie siedział w katalogu głównym!Spróbuj użyć PathMatchConfigurer (Spring Boot 2.x):
źródło
Możesz utworzyć klasę bazową z
@RequestMapping("rest")
adnotacjami i rozszerzyć wszystkie inne klasy o tę klasę bazową.Teraz wszystkie klasy, które rozszerzają tę klasę bazową, będą dostępne pod adresem
rest/**
.źródło
Dla tych, którzy używają konfiguracji YAML (application.yaml).
Uwaga : to działa tylko dla
Spring Boot 2.x.x
Jeśli nadal używasz
Spring Boot 1.x
źródło
W przypadku spring-boot 2.x możesz skonfigurować w application.properties:
źródło
server.servlet.context-path=/api
byłoby rozwiązaniem, jak sądzę. Miałem ten sam problem i to mnie rozwiązało. Użyłem server.context-path. Wydawało się jednak, że jest to przestarzałe i stwierdziłem, żeserver.servlet.context-path
teraz rozwiązuje problem. Innym rozwiązaniem, które znalazłem, było dodanie tagu podstawowego do moich stron w interfejsie (H5). Mam nadzieję, że to komuś pomoże.Twoje zdrowie
źródło
To rozwiązanie ma zastosowanie, jeśli:
RestController
ale nieController
.Nie używasz Spring Data Rest.
}
Jest to podobne do rozwiązania opublikowanego przez mh-dev, ale myślę, że jest trochę czystsze i powinno być obsługiwane w każdej wersji Spring Boot 1.4.0+, w tym 2.0.0+.
źródło
Zgodnie z dokumentami REST Spring Data , jeśli używasz application.properties , użyj tej właściwości, aby ustawić ścieżkę podstawową:
Pamiętaj jednak, że Spring używa luźnego wiązania , więc można użyć tej odmiany:
... lub ten, jeśli wolisz:
Jeśli używasz application.yml , użyjesz dwukropków jako separatorów kluczy:
(Dla porównania, powiązany bilet został utworzony w marcu 2018 r., Aby wyjaśnić dokumenty.)
źródło
działał server.contextPath = / path
źródło
Możesz utworzyć niestandardową adnotację dla swoich kontrolerów:
Użyj go zamiast zwykłego @RestController w klasach kontrolera i dodaj adnotacje za pomocą @RequestMapping.
Działa dobrze na wiosnę 4.2!
źródło