J'essaie de mélanger mvc et me reposer dans un seul projet de démarrage à ressort.
Je veux définir le chemin de base pour tous les contrôleurs de repos (par exemple, example.com/api) en un seul endroit (je ne veux pas annoter chaque contrôleur avec @RequestMapping('api/products')
, à la place, juste @RequestMapping('/products')
.
Les contrôleurs MVC doivent être accessibles par example.com/whatever
C'est possible?
(Je n'utilise pas de repos de données à ressort, juste à ressort mvc)
java
spring
rest
spring-boot
spring-mvc
Teimuraz
la source
la source
Réponses:
Avec Spring Boot 1.2+ (<2.0), il suffit d'une seule propriété dans application.properties:
lien de référence: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri
Pour 2.x, utilisez
la source
Un peu tard mais la même question m'a amené ici avant d'arriver à la réponse alors je la poste ici. Créez (si vous ne l'avez toujours pas) une application.properties et ajoutez
Donc, dans l'exemple précédent, si vous avez un RestController,
@RequestMapping("/test")
vous y accéderez commelocalhost:8080/api/test/{your_rest_method}
source de la question: comment choisir l'URL de mon application Web Spring Boot
la source
Pour la version du framework Spring Boot
2.0.4.RELEASE+
. Ajouter cette ligne àapplication.properties
la source
spring.data.rest.basePath
ne fonctionne pas pour Spring Boot 2Comme il s'agit du premier hit google pour le problème et je suppose que plus de gens le rechercheront. Il existe une nouvelle option depuis Spring Boot '1.4.0'. Il est désormais possible de définir un RequestMappingHandlerMapping personnalisé qui permet de définir un chemin différent pour les classes annotées avec @RestController
Une version différente avec des annotations personnalisées qui combine @RestController avec @RequestMapping peut être trouvée dans ce billet de blog
la source
Je ne pouvais pas croire à quel point la réponse à cette question apparemment simple est compliquée. Voici quelques références:
Il y a beaucoup de choses différentes à considérer:
server.context-path=/api
dans,application.properties
vous pouvez configurer un préfixe pour tout (son chemin server.context et non server.contextPath!)spring.data.rest.base-path
dansapplication.properties
. Mais tout simplement@RestController
ne prendra pas cela en compte. Selon la documentation du repos de données de printemps, il existe une annotation@BasePathAwareController
que vous pouvez utiliser pour cela. Mais j'ai des problèmes avec Spring-security lorsque j'essaye de sécuriser un tel contrôleur. On ne le trouve plus.Une autre solution de contournement est une astuce simple. Vous ne pouvez pas préfixer une chaîne statique dans une annotation, mais vous pouvez utiliser des expressions comme celle-ci:
la source
Pour Boot 2.0.0+, cela fonctionne pour moi: server.servlet.context-path = / api
la source
J'ai trouvé une solution propre, qui n'affecte que les contrôleurs de repos.
Spring boot enregistrera deux servlets de dispatcher - par défaut
dispatcherServlet
pour les contrôleurs, etrestApi
dispatcher pour@RestControllers
défini dansrest.xml
:L'exemple
rest.xml
:Mais, vous n'êtes pas limité à :
XmlWebApplicationContext
, vous pouvez utiliser tout autre type de contexte disponible, ie.AnnotationConfigWebApplicationContext
,GenericWebApplicationContext
,GroovyWebApplicationContext
, ...jsonMessageConverter
, lesmessageConverters
beans en contexte de repos, ils peuvent être définis dans le contexte parentla source
Vous pouvez créer une annotation personnalisée pour vos contrôleurs:
Utilisez-le à la place du @RestController habituel sur vos classes de contrôleur et annotez les méthodes avec @RequestMapping.
Juste testé - fonctionne au printemps 4.2!
la source
RequestMappingHandlerMapping
. Spring Data REST a un mappeur similaire à ce dont vous avez besoin -BasePathAwareHandlerMapping
.Je suis peut-être un peu en retard, MAIS ... je pense que c'est la meilleure solution. Configurez-le dans votre application.yml (ou fichier de configuration analogique):
Si je me souviens bien, c'est tout - tous vos référentiels seront exposés sous cet URI.
la source
spring.data.rest.base-path
n'affecte que le repos des données du printemps et les hateoas du printemps. Plain @RestController restera assis à la racine!Essayez d'utiliser un PathMatchConfigurer (Spring Boot 2.x):
la source
Vous pouvez créer une classe de base avec des
@RequestMapping("rest")
annotations et étendre toutes vos autres classes avec cette classe de base.Désormais, toutes les classes qui étendent cette classe de base seront accessibles sur
rest/**
.la source
Pour ceux qui utilisent la configuration YAML (application.yaml).
Remarque : cela ne fonctionne que pour
Spring Boot 2.x.x
Si vous utilisez toujours
Spring Boot 1.x
la source
Avec spring-boot 2.x, vous pouvez configurer dans application.properties:
la source
server.servlet.context-path=/api
serait la solution je suppose. J'ai eu le même problème et cela m'a résolu. J'ai utilisé server.context-path. Cependant, cela semblait être obsolète et j'ai trouvé que celaserver.servlet.context-path
résout le problème maintenant. Une autre solution de contournement que j'ai trouvée a été d'ajouter une balise de base à mes pages frontales (H5). J'espère que cela aide quelqu'un là-bas.À votre santé
la source
Cette solution s'applique si:
RestController
mais pasController
.Vous n'utilisez pas Spring Data Rest.
}
Ceci est similaire à la solution publiée par mh-dev, mais je pense que c'est un peu plus propre et que cela devrait être pris en charge sur n'importe quelle version de Spring Boot 1.4.0+, y compris 2.0.0+.
la source
Par documentation REST Spring Data , si vous utilisez application.properties , utilisez cette propriété pour définir votre chemin de base:
Mais notez que Spring utilise une reliure détendue , donc cette variante peut être utilisée:
... ou celui-ci si vous préférez:
Si vous utilisez application.yml , vous utiliseriez deux points pour les séparateurs de clé:
(Pour référence, un ticket associé a été créé en mars 2018 pour clarifier les documents.)
la source
a travaillé server.contextPath = / chemin
la source
Vous pouvez créer une annotation personnalisée pour vos contrôleurs:
Utilisez-le à la place du @RestController habituel sur vos classes de contrôleur et annotez les méthodes avec @RequestMapping.
Fonctionne bien au printemps 4.2!
la source