Estou tentando misturar mvc e descanso em um único projeto de inicialização de mola.
Quero definir o caminho base para todos os controladores de resto (por exemplo, example.com/api) em um único lugar (não quero anotar cada controlador @RequestMapping('api/products')
, em vez disso, apenas @RequestMapping('/products')
.
Os controladores Mvc devem ser acessados por example.com/whatever
É possível?
(Eu não uso o descanso de dados da primavera, apenas o mvc da primavera)
java
spring
rest
spring-boot
spring-mvc
Teimuraz
fonte
fonte
Respostas:
Com Spring Boot 1.2+ (<2.0), tudo o que é necessário é uma única propriedade em application.properties:
link de referência: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri
Para 2.x, use
fonte
Um pouco tarde, mas a mesma pergunta me trouxe aqui antes de chegar a resposta, então eu a posto aqui. Crie (se ainda não tiver) um application.properties e adicione
Então, no exemplo anterior, se você tiver um RestController com
@RequestMapping("/test")
você irá acessá-lo comolocalhost:8080/api/test/{your_rest_method}
fonte da pergunta: como faço para escolher o url para meu webapp de boot do Spring
fonte
Para a versão do framework de boot de primavera
2.0.4.RELEASE+
. Adicione esta linha aapplication.properties
fonte
spring.data.rest.basePath
não funciona para o Spring boot 2Uma vez que esta é a primeira resposta do Google para o problema e presumo que mais pessoas pesquisarão por isso. Existe uma nova opção desde o Spring Boot '1.4.0'. Agora é possível definir um RequestMappingHandlerMapping personalizado que permite definir um caminho diferente para as classes anotadas com @RestController
Uma versão diferente com anotações personalizadas que combina @RestController com @RequestMapping pode ser encontrada nesta postagem do blog
fonte
Eu não conseguia acreditar como a resposta a esta pergunta aparentemente simples é complicada. Aqui estão algumas referências:
Existem muitas coisas diferentes a serem consideradas:
server.context-path=/api
em,application.properties
você pode configurar um prefixo para tudo . (Seu server.context-path não server.contextPath!)spring.data.rest.base-path
emapplication.properties
. Mas o plain@RestController
não vai levar isso em conta. De acordo com a documentação do Spring Data Rest, há uma anotação@BasePathAwareController
que você pode usar para isso. Mas eu tenho problemas em conexão com o Spring-security quando tento proteger esse controlador. Não foi mais encontrado.Outra solução alternativa é um truque simples. Você não pode prefixar uma String estática em uma anotação, mas pode usar expressões como esta:
fonte
Para Boot 2.0.0+ isso funciona para mim: server.servlet.context-path = / api
fonte
Eu encontrei uma solução limpa, que afeta apenas os controladores de descanso.
O Spring boot registrará dois servlets dispatcher - padrão
dispatcherServlet
para controladores erestApi
dispatcher para@RestControllers
definidos emrest.xml
:O exemplo
rest.xml
:Mas você não está limitado a :
XmlWebApplicationContext
, você pode usar qualquer outro tipo de contexto disponível, ou seja,AnnotationConfigWebApplicationContext
,GenericWebApplicationContext
,GroovyWebApplicationContext
, ...jsonMessageConverter
,messageConverters
feijão no contexto de repouso, eles podem ser definidos no contexto paifonte
Você pode criar uma anotação personalizada para seus controladores:
Use-o em vez do @RestController usual em suas classes de controlador e anote métodos com @RequestMapping.
Acabei de testar - funciona no Spring 4.2!
fonte
RequestMappingHandlerMapping
. Spring Data REST tem um mapeador semelhante ao que você precisa -BasePathAwareHandlerMapping
.Posso chegar um pouco tarde, MAS ... acredito que seja a melhor solução. Configure-o em seu application.yml (ou arquivo de configuração analógico):
Como posso me lembrar, é isso - todos os seus repositórios serão expostos abaixo deste URI.
fonte
spring.data.rest.base-path
afeta apenas spring-data-rest e spring-hateoas. O @RestController simples ainda ficará na raiz!Tente usar um PathMatchConfigurer (Spring Boot 2.x):
fonte
Você pode criar uma classe base com
@RequestMapping("rest")
anotações e estender todas as outras classes com esta classe base.Agora, todas as classes que estendem esta classe base estarão acessíveis em
rest/**
.fonte
Para quem usa a configuração YAML (application.yaml).
Nota : isso funciona apenas para
Spring Boot 2.x.x
Se você ainda está usando
Spring Boot 1.x
fonte
Com o spring-boot 2.x você pode configurar em application.properties:
fonte
server.servlet.context-path=/api
seria a solução, eu acho. Eu tive o mesmo problema e isso me resolveu. Eu usei server.context-path. No entanto, parecia estar obsoleto e descobri queserver.servlet.context-path
agora resolve o problema. Outra solução alternativa que encontrei foi adicionar uma tag base às minhas páginas de front end (H5). Eu espero que isto ajude alguém lá fora.Felicidades
fonte
Esta solução se aplica se:
RestController
mas nãoController
.Você não está usando Spring Data Rest.
}
Isso é semelhante à solução postada por mh-dev, mas acho que é um pouco mais limpo e deve ser compatível com qualquer versão do Spring Boot 1.4.0+, incluindo 2.0.0+.
fonte
De acordo com os documentos REST do Spring Data , se estiver usando application.properties , use esta propriedade para definir seu caminho base:
Mas observe que o Spring usa ligação relaxada , então esta variação pode ser usada:
... ou este se preferir:
Se usar application.yml , você usaria dois pontos para separadores de chave:
(Para referência, um tíquete relacionado foi criado em março de 2018 para esclarecer os documentos.)
fonte
funcionou server.contextPath = / path
fonte
Você pode criar uma anotação personalizada para seus controladores:
Use-o em vez do @RestController usual em suas classes de controlador e anote métodos com @RequestMapping.
Funciona bem no Spring 4.2!
fonte