Ich versuche, mvc zu mischen und mich in einem einzigen Spring-Boot-Projekt auszuruhen.
Ich möchte den Basispfad für alle Rest-Controller (z. B. example.com/api) an einem einzigen Ort festlegen (ich möchte nicht jeden Controller mit Anmerkungen versehen @RequestMapping('api/products')
stattdessen nur@RequestMapping('/products')
.
Mvc-Controller sollten über example.com/whatever zugänglich sein
Ist es möglich?
(Ich benutze keine Federdatenruhe, nur Feder-MVC)
java
spring
rest
spring-boot
spring-mvc
Teimuraz
quelle
quelle
Antworten:
Mit Spring Boot 1.2+ (<2.0) ist lediglich eine einzige Eigenschaft in application.properties erforderlich:
Referenzlink: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri
Verwenden Sie für 2.x.
quelle
Ein bisschen spät, aber die gleiche Frage brachte mich hierher, bevor ich die Antwort erreichte, also poste ich sie hier. Erstellen Sie (falls Sie es noch nicht haben) eine application.properties und fügen Sie sie hinzu
Wenn Sie also im vorherigen Beispiel einen RestController dabei
@RequestMapping("/test")
haben, greifen Sie wie folgt darauf zulocalhost:8080/api/test/{your_rest_method}
Frage Quelle: Wie wähle ich die URL für meine Spring Boot Webapp
quelle
Für Spring Boot Framework Version
2.0.4.RELEASE+
. Fügen Sie diese Zeile hinzuapplication.properties
quelle
spring.data.rest.basePath
funktioniert nicht für Spring Boot 2Da dies der erste Google-Treffer für das Problem ist und ich davon ausgehe, dass mehr Leute danach suchen werden. Seit Spring Boot '1.4.0' gibt es eine neue Option. Es ist jetzt möglich, ein benutzerdefiniertes RequestMappingHandlerMapping zu definieren, mit dem ein anderer Pfad für mit @RestController kommentierte Klassen definiert werden kann
Eine andere Version mit benutzerdefinierten Anmerkungen, die @RestController mit @RequestMapping kombiniert , finden Sie in diesem Blogbeitrag
quelle
Ich konnte nicht glauben, wie kompliziert die Antwort auf diese scheinbar einfache Frage ist. Hier einige Referenzen:
Es gibt viele verschiedene Dinge zu beachten:
server.context-path=/api
inapplication.properties
Sie können ein Präfix für konfigurieren alles . (Sein server.context-Pfad nicht server.contextPath!)spring.data.rest.base-path
inapplication.properties
. Aber einfach@RestController
wird dies nicht berücksichtigt. Laut der Dokumentation der Federdatenreste gibt es eine Anmerkung@BasePathAwareController
, die Sie dafür verwenden können. Ich habe jedoch Probleme mit der Spring-Sicherheit, wenn ich versuche, einen solchen Controller zu sichern. Es wird nicht mehr gefunden.Eine weitere Problemumgehung ist ein einfacher Trick. Sie können einer Annotation keinen statischen String voranstellen, aber Sie können Ausdrücke wie diesen verwenden:
quelle
Für Boot 2.0.0+ funktioniert dies für mich: server.servlet.context-path = / api
quelle
Ich habe eine saubere Lösung gefunden, die nur Rest-Controller betrifft.
Spring Boot registriert zwei Dispatcher-Servlets - Standard
dispatcherServlet
für Controller undrestApi
Dispatcher für@RestControllers
definiert inrest.xml
:Das Beispiel
rest.xml
:Sie sind jedoch nicht beschränkt auf :
XmlWebApplicationContext
Sie, können Sie einen anderen verfügbaren Kontexttyp verwenden, z.AnnotationConfigWebApplicationContext
,GenericWebApplicationContext
,GroovyWebApplicationContext
, ...jsonMessageConverter
,messageConverters
Beans im Ruhekontext, sie können im übergeordneten Kontext definiert werdenquelle
Sie können eine benutzerdefinierte Anmerkung für Ihre Controller erstellen:
Verwenden Sie es anstelle des üblichen @RestControllers für Ihre Controller-Klassen und kommentieren Sie Methoden mit @RequestMapping.
Gerade getestet - funktioniert im Frühjahr 4.2!
quelle
RequestMappingHandlerMapping
. Spring Data REST verfügt über einen Mapper, der Ihren Anforderungen entsprichtBasePathAwareHandlerMapping
.Ich könnte etwas spät dran sein, ABER ... Ich glaube, es ist die beste Lösung. Richten Sie es in Ihrer application.yml (oder einer analogen Konfigurationsdatei) ein:
Soweit ich mich erinnern kann, werden alle Ihre Repositorys unter dieser URI angezeigt.
quelle
spring.data.rest.base-path
wirkt sich nur auf Spring-Data-Rest und Spring-Hateoas aus. Plain @RestController wird immer noch an der Wurzel sitzen!Versuchen Sie es mit einem PathMatchConfigurer (Spring Boot 2.x):
quelle
Sie können eine Basisklasse mit
@RequestMapping("rest")
Anmerkungen erstellen und alle anderen Klassen mit dieser Basisklasse erweitern.Jetzt sind alle Klassen zugänglich, die diese Basisklasse erweitern
rest/**
.quelle
Für diejenigen, die die YAML-Konfiguration verwenden (application.yaml).
Hinweis : Dies funktioniert nur für
Spring Boot 2.x.x
Wenn Sie noch verwenden
Spring Boot 1.x
quelle
Mit Spring-Boot 2.x können Sie in application.properties Folgendes konfigurieren:
quelle
server.servlet.context-path=/api
wäre die Lösung, denke ich. Ich hatte das gleiche Problem und das hat mich gelöst. Ich habe server.context-path verwendet. Das schien jedoch veraltet zu sein und ich fand, dassserver.servlet.context-path
das Problem jetzt gelöst ist. Eine weitere Problemumgehung war das Hinzufügen eines Basis-Tags zu meinen Front-End-Seiten (H5). Ich hoffe das hilft jemandem da draußen.Prost
quelle
Diese Lösung gilt, wenn:
RestController
aber nichtController
.Sie verwenden Spring Data Rest nicht.
}}
Dies ähnelt der von mh-dev veröffentlichten Lösung , aber ich denke, dies ist ein wenig sauberer und sollte auf jeder Version von Spring Boot 1.4.0+, einschließlich 2.0.0+, unterstützt werden.
quelle
Verwenden Sie in Spring Data REST- Dokumenten , wenn Sie application.properties verwenden, diese Eigenschaft, um Ihren Basispfad festzulegen:
Beachten Sie jedoch, dass Spring eine entspannte Bindung verwendet , sodass diese Variante verwendet werden kann:
... oder dieses, wenn Sie es vorziehen:
Wenn Sie application.yml verwenden , würden Sie Doppelpunkte für Schlüsseltrennzeichen verwenden:
(Als Referenz wurde im März 2018 ein entsprechendes Ticket erstellt, um die Dokumente zu verdeutlichen.)
quelle
arbeitete server.contextPath = / path
quelle
Sie können eine benutzerdefinierte Anmerkung für Ihre Controller erstellen:
Verwenden Sie es anstelle des üblichen @RestControllers für Ihre Controller-Klassen und kommentieren Sie Methoden mit @RequestMapping.
Funktioniert gut im Frühjahr 4.2!
quelle