Estoy tratando de mezclar mvc y descansar en un solo proyecto de arranque de primavera.
Quiero establecer la ruta base para todos los controladores de descanso (por ejemplo, example.com/api) en un solo lugar (no quiero anotar cada controlador con @RequestMapping('api/products')
, en su lugar, solo @RequestMapping('/products')
.
Se debe poder acceder a los controladores MVC mediante example.com/whatever
¿Es posible?
(No uso el descanso de datos de primavera, solo mvc de primavera)
java
spring
rest
spring-boot
spring-mvc
Teimuraz
fuente
fuente
Respuestas:
Con Spring Boot 1.2+ (<2.0), todo lo que se necesita es una propiedad única en application.properties:
enlace de referencia: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri
Para 2.x, utilice
fuente
Un poco tarde, pero la misma pregunta me trajo aquí antes de llegar a la respuesta, así que la publico aquí. Crea (si aún no lo tienes) un application.properties y agrega
Entonces, en el ejemplo anterior, si tiene un RestController
@RequestMapping("/test")
, accederá a él comolocalhost:8080/api/test/{your_rest_method}
fuente de la pregunta: ¿cómo elijo la URL para mi aplicación web de arranque de primavera?
fuente
Para la versión de marco de arranque de primavera
2.0.4.RELEASE+
. Agregar esta línea aapplication.properties
fuente
spring.data.rest.basePath
no funciona para Spring Boot 2Dado que este es el primer resultado de Google para el problema, supongo que más personas buscarán esto. Hay una nueva opción desde Spring Boot '1.4.0'. Ahora es posible definir un RequestMappingHandlerMapping personalizado que permite definir una ruta diferente para las clases anotadas con @RestController
En esta publicación del blog se puede encontrar una versión diferente con anotaciones personalizadas que combina @RestController con @RequestMapping
fuente
No podía creer lo complicada que es la respuesta a esta pregunta aparentemente simple. A continuación se muestran algunas referencias:
Hay muchas cosas diferentes a considerar:
server.context-path=/api
en elapplication.properties
que puede configurar un prefijo para todo . (Su-server.context camino no server.contextPath!)spring.data.rest.base-path
enapplication.properties
. Pero plain@RestController
no tendrá esto en cuenta. De acuerdo con la documentación del resto de datos de primavera, hay una anotación@BasePathAwareController
que puede usar para eso. Pero tengo problemas en relación con Spring-security cuando trato de asegurar dicho controlador. Ya no se encuentra.Otra solución es un truco simple. No puede prefijar una cadena estática en una anotación, pero puede usar expresiones como esta:
fuente
Para Boot 2.0.0+ esto me funciona: server.servlet.context-path = / api
fuente
Encontré una solución limpia, que afecta solo a los controladores de reposo.
Spring boot registrará dos servlets de despachador - predeterminado
dispatcherServlet
para controladores yrestApi
despachador para@RestControllers
definido enrest.xml
:El ejemplo
rest.xml
:Pero no estás limitado a :
XmlWebApplicationContext
, puede utilizar cualquier otro tipo de contexto disponible, es decir.AnnotationConfigWebApplicationContext
,GenericWebApplicationContext
,GroovyWebApplicationContext
, ...jsonMessageConverter
,messageConverters
frijoles en contexto de reposo, se pueden definir en contexto padrefuente
Puede crear una anotación personalizada para sus controladores:
Úselo en lugar del @RestController habitual en sus clases de controlador y anote métodos con @RequestMapping.
Recién probado, ¡funciona en Spring 4.2!
fuente
RequestMappingHandlerMapping
. Primavera de datos REST tiene un mapeador similar a lo que necesita -BasePathAwareHandlerMapping
.Puede que llegue un poco tarde, PERO ... creo que es la mejor solución. Configúrelo en su application.yml (o archivo de configuración analógica):
Como puedo recordar, eso es todo: todos sus repositorios estarán expuestos debajo de este URI.
fuente
spring.data.rest.base-path
solo afecta a spring-data-rest y spring-hateoas. ¡El @RestController simple seguirá sentado en la raíz!Intente utilizar PathMatchConfigurer (Spring Boot 2.x):
fuente
Puede crear una clase base con
@RequestMapping("rest")
anotaciones y ampliar todas las demás clases con esta clase base.Ahora se podrá acceder a todas las clases que amplíen esta clase base en
rest/**
.fuente
Para aquellos que usan la configuración YAML (application.yaml).
Nota : esto solo funciona para
Spring Boot 2.x.x
Si todavía está usando
Spring Boot 1.x
fuente
Con spring-boot 2.x puede configurar en application.properties:
fuente
server.servlet.context-path=/api
sería la solución, supongo. Tuve el mismo problema y esto me resolvió. Usé server.context-path. Sin embargo, eso parecía estar desaprobado y descubrí queserver.servlet.context-path
ahora resuelve el problema. Otra solución que encontré fue agregar una etiqueta base a mis páginas frontales (H5). Espero que esto ayude a alguien.Salud
fuente
Esta solución se aplica si:
RestController
pero noController
.No está utilizando Spring Data Rest.
}
Esto es similar a la solución publicada por mh-dev, pero creo que es un poco más limpia y debería ser compatible con cualquier versión de Spring Boot 1.4.0+, incluida la 2.0.0+.
fuente
Según los documentos REST de Spring Data , si usa application.properties , use esta propiedad para establecer su ruta base:
Pero tenga en cuenta que Spring usa un enlace relajado , por lo que esta variación se puede usar:
... o este si lo prefieres:
Si usa application.yml , usaría dos puntos para los separadores de clave:
(Como referencia, se creó un ticket relacionado en marzo de 2018 para aclarar los documentos).
fuente
funcionó server.contextPath = / ruta
fuente
Puede crear una anotación personalizada para sus controladores:
Úselo en lugar del @RestController habitual en sus clases de controlador y anote métodos con @RequestMapping.
¡Funciona bien en Spring 4.2!
fuente