Esta é a continuação da pergunta Spring MVC @PathVariable ficando truncada
O fórum do Spring declara que foi corrigido (versão 3.2) como parte do ContentNegotiationManager. veja o link abaixo.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632
No meu pedido requestParameter com .com está truncado.
Alguém poderia me explicar como usar esse novo recurso? como é configurável no xml?
Nota: spring forum- # 1 Spring MVC @PathVariable com ponto (.) Está sendo truncado
spring
rest
spring-mvc
spring-annotations
Kanagavelu Sugumar
fonte
fonte
<!-- Spring Configuration needed to avoid URI using dots to be truncated --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false" /> </bean>
{variable_name:regular_expression}
, então aqui temos a variável nomeadavariable
, cujo valor será correspondido usando regex.+
(onde.
significa 'qualquer caractere' e+
significa 'uma ou mais vezes').variable
regularmente, o Spring usará os recursos de detecção de sufixo e truncará tudo após o ponto. Quando você usa a correspondência de regexp, esses recursos não são usados - a variável é correspondida apenas à regexp que você fornece."variable:.+"
não funciona quando há mais de um ponto na variável. por exemplo, colocar e-mails no final de caminhos tranqüilos como/path/[email protected]
. O controlador nem é chamado, mas funciona quando há apenas um ponto/path/[email protected]
. Alguma idéia do porquê e / ou uma solução alternativa?O Spring considera que qualquer coisa por trás do último ponto é uma extensão de arquivo como
.json
ou.xml
e o trucate para recuperar seu parâmetro.Então, se você tem
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
Ou/somepath/param.anything
irá resultar em uma param com valorparam
/somepath/param.value.json
,/somepath/param.value.xml
ou/somepath/param.value.anything
resultará em um parâmetro com valorparam.value
se você alterar seu mapeamento para
/somepath/{variable:.+}
o sugerido, qualquer ponto, incluindo o último, será considerado como parte do seu parâmetro:/somepath/param
resultará em um parâmetro com valorparam
/somepath/param.json
resultará em um parâmetro com valorparam.json
/somepath/param.xml
resultará em um parâmetro com valorparam.xml
/somepath/param.anything
resultará em um parâmetro com valorparam.anything
/somepath/param.value.json
resultará em um parâmetro com valorparam.value.json
Se você não se importa com o reconhecimento de extensão, pode desativá-lo substituindo
mvc:annotation-driven
automagic:Então, novamente, se você tiver
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
Ou/somepath/param.anything
irá resultar em uma param com valorparam
/somepath/param.value.json
,/somepath/param.value.xml
ou/somepath/param.value.anything
resultará em um parâmetro com valorparam.value
nota: a diferença da configuração padrão é visível somente se você tiver um mapeamento semelhante
somepath/something.{variable}
. consulte Problema do projeto Resthubse você deseja manter o gerenciamento de extensões, desde o Spring 3.2, também é possível definir a propriedade useRegisteredSuffixPatternMatch do bean RequestMappingHandlerMapping para manter o reconhecimento de sufixoPattern ativado, mas limitado à extensão registrada.
Aqui você define apenas extensões json e xml:
Observe que o mvc: annotation-driven agora aceita uma opção contentNegotiation para fornecer um bean personalizado, mas a propriedade RequestMappingHandlerMapping deve ser alterada para true (padrão false) (consulte https://jira.springsource.org/browse/SPR-7632 )
Por esse motivo, você ainda precisa substituir a configuração toda orientada a anotações do mvc :. Abri um ticket para o Spring para solicitar um RequestMappingHandlerMapping personalizado: https://jira.springsource.org/browse/SPR-11253 . Por favor vote se você estiver interessado.
Ao substituir, tome cuidado para considerar também a substituição personalizada do gerenciamento de Execução. Caso contrário, todos os seus mapeamentos de exceção personalizados falharão. Você precisará reutilizar messageCoverters com um bean de lista:
Eu implementei, no projeto de código aberto Resthub do qual faço parte, um conjunto de testes sobre esses assuntos: consulte https://github.com/resthub/resthub-spring-stack/pull/219/files & https: // github.com/resthub/resthub-spring-stack/issues/217
fonte
Atualização para o Spring 4: desde a versão 4.0.1, você pode usar
PathMatchConfigurer
(via suaWebMvcConfigurer
), por exemploEm xml, seria ( https://jira.spring.io/browse/SPR-10163 ):
fonte
matcher.setUseSuffixPatternMatch(false)
para desativar completamente a correspondência de sufixo.Além da resposta de Martin Frey, isso também pode ser corrigido adicionando uma barra no valor RequestMapping:
Lembre-se de que essa correção não oferece suporte à manutenção. Agora, exige que todos os URIs tenham uma barra final - algo que pode não ser aparente para os usuários / novos desenvolvedores da API. Como é provável que nem todos os parâmetros tenham um
.
neles, também pode criar erros intermitentesfonte
No Spring Boot Rest Controller, eu os resolvi seguindo as etapas:
RestController:
E do cliente em repouso:
fonte
adicionar o ":. +" funcionou para mim, mas não até remover os colchetes externos.
value = { "/username/{id:.+}" } não funcionou
value = "/username/{id:.+}" funciona
Espero ter ajudado alguém :)
fonte
id
/somepath/{variable:.+}
funciona narequestMapping
tag Java .fonte
"/{code:.+}"
obras para muitos pontos e não um ou seja,61.12.7
ele também funciona para o IE[email protected]
Aqui está uma abordagem que se baseia puramente na configuração java:
fonte
Uma maneira bem fácil de solucionar esse problema é anexar uma barra final ...
por exemplo:
usar :
ao invés de:
fonte
No Spring Boot, a expressão Regular resolve o problema como
fonte
"/{code:.+}"
obras para muitos pontos e não um ou seja,61.12.7
ele também funciona para o IE[email protected]
A solução completa, incluindo endereços de e-mail nos nomes dos caminhos para o primavera 4.2, é
Adicione isso ao application-xml
fonte
Se você estiver usando o Spring 3.2.xe
<mvc:annotation-driven />
crie este pequenoBeanPostProcessor
:Em seguida, coloque isso no seu xml de configuração do MVC:
fonte
BeanPostProcessor
para isso. Se você usar,WebMvcConfigurationSupport
poderá substituir orequestMappingHandlerMapping
@Bean
método. Se você usa a configuração XML, basta declarar seu próprioRequestMappingHandlerMapping
bean e declarar essa propriedade.Finalmente encontrei a solução no Spring Docs :
Adicionar isso à minha
WebMvcConfigurerAdapter
implementação resolveu o problema:fonte
Para mim o
funciona, mas somente se você também codificar o "ponto" no URL da sua solicitação como "% 2E", funciona. Mas exige que URLs sejam tudo isso ... que não é uma codificação "padrão", embora válida. Parece um bug: |
A outra solução alternativa, semelhante à maneira "trailing slash", é mover a variável que terá o ponto "inline" ex:
@GetMapping (caminho = "/ {variableName} / a")
agora todos os pontos serão preservados, nenhuma modificação ou regex é necessária.
fonte
A partir do Spring 5.2.4 (Spring Boot v2.2.6.RELEASE)
PathMatchConfigurer.setUseSuffixPatternMatch
eContentNegotiationConfigurer.favorPathExtension
foi preterido ( https://spring.io/blog/2020/03/24/spring-framework-5-2-5-available-now e https://github.com/spring-projects/spring-framework/issues/24179 ).O verdadeiro problema é que o cliente solicita um tipo de mídia específico (como .com) e o Spring adicionou todos esses tipos de mídia por padrão. Na maioria dos casos, seu controlador REST produzirá apenas JSON, portanto, não suportará o formato de saída solicitado (.com). Para superar esse problema, você deve ser bom atualizando seu controlador de descanso (ou método específico) para suportar o formato 'ouput' (
@RequestMapping(produces = MediaType.ALL_VALUE
)) e, é claro, permitir caracteres como um ponto ({username:.+}
).Exemplo:
O Spring 5.3 e superior corresponderão apenas a sufixos registrados (tipos de mídia).
fonte