Spring MVC @PathVariable com ponto (.) Está ficando truncado

Esta é continuação da pergunta Spring MVC @PathVariable ficando truncada

Fórum da spring afirma 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 é truncado.

Alguém poderia me explicar como usar esse novo recurso? como é configurável em xml?

Nota: fórum de primavera # 1 Spring MVC @PathVariable com ponto (.) Está ficando truncado

Tanto quanto eu sei que este problema aparece apenas para o pathvariable no final do requestmapping.

Conseguimos resolver isso definindo o addon regex no requestmapping.

/somepath/{variable:.+} 

Spring considera que qualquer coisa por trás do último ponto é uma extensão de arquivo, como .json ou .xml e trucada para recuperar seu parâmetro.

Então, se você tiver /somepath/{variable} :

  • /somepath/param , /somepath/param.json , /somepath/param.xml ou /somepath/param.anything resultará em um param com valor param
  • /somepath/param.value.json , /somepath/param.value.xml ou /somepath/param.value.anything resultará em um parâmetro com valor param.value

Se você alterar seu mapeamento para /somepath/{variable:.+} como sugerido, qualquer ponto, incluindo o último, será considerado como parte de seu parâmetro:

  • /somepath/param resultará em um param com valor param
  • /somepath/param.json resultará em um param com valor param.json
  • /somepath/param.xml resultará em um parâmetro com valor param.xml
  • /somepath/param.anything resultará em um param com valor param.anything
  • /somepath/param.value.json resultará em um parâmetro com valor param.value.json

Se você não se importa com o reconhecimento da extensão, você pode desativá-lo substituindo mvc:annotation-driven automagic do mvc:annotation-driven :

     

Então, novamente, se você tiver /somepath/{variable} :

  • /somepath/param , /somepath/param.json , /somepath/param.xml ou /somepath/param.anything resultará em um param com valor param
  • /somepath/param.value.json , /somepath/param.value.xml ou /somepath/param.value.anything resultará em um parâmetro com valor param.value

Nota: a diferença da configuração padrão é visível apenas se você tiver um mapeamento como somepath/something.{variable} . veja a questão do projeto Resthub

Se você quiser manter o gerenciamento de extensão, desde o Spring 3.2, você também pode definir a propriedade useRegisteredSuffixPatternMatch do bean RequestMappingHandlerMapping para manter o reconhecimento suffixPattern ativado, mas limitado à extensão registrada.

Aqui você define apenas as extensões json e xml:

          json=application/json xml=application/xml    

Note que mvc: annotation-driven aceita agora uma opção contentNegotiation para fornecer um bean customizado, mas a propriedade de RequestMappingHandlerMapping deve ser alterada para true (default false) (cf. https://jira.springsource.org/browse/SPR-7632 ).

Por esse motivo, você ainda precisa sobrescrever toda a configuração orientada por annotations do mvc :. Eu abri um ticket para Spring para pedir um RequestMappingHandlerMapping customizado: https://jira.springsource.org/browse/SPR-11253 . Por favor, vote se você for interceptado.

Ao mesmo tempo, é importante 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ê terá que reutilizar messageCoverters com um bean de lista:

                            

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

Atualização para o Spring 4: desde a PathMatchConfigurer 4.0.1 você pode usar o PathMatchConfigurer (através do seu WebMvcConfigurer ), por exemplo

 @Configuration protected static class AllResources extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer matcher) { matcher.setUseRegisteredSuffixPatternMatch(true); } } 

Em xml, seria ( https://jira.spring.io/browse/SPR-10163 ):

  [...]   

Além da resposta de Martin Frey, isso também pode ser corrigido adicionando uma barra no valor RequestMapping:

 /path/{variable}/ 

Tenha em mente que essa correção não suporta manutenção. Ele agora exige que todos os URIs tenham uma barra final – algo que pode não ser aparente para os usuários da API / novos desenvolvedores. Porque é provável que nem todos os parâmetros tenham um . neles, também pode criar erros intermitentes

adicionando o “:. +” funcionou para mim, mas não até que eu removesse as chaves externas.

value = { “/username/{id:.+}” } não funcionou

value = “/username/{id:.+” ” funciona

Espero ter ajudado alguém 🙂

No Spring Boot Rest Controller, eu os resolvi seguindo os Passos:

RestController:

 @GetMapping("/statusByEmail/{email:.+}/") public String statusByEmail(@PathVariable(value = "email") String email){ //code } 

E do resto do cliente:

 Get http://mywebhook.com/statusByEmail/abc.test@gmail.com/ 

/somepath/{variable:.+} funciona na tag Java requestMapping .

Aqui está uma abordagem que depende exclusivamente da configuração do java:

 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @Configuration public class MvcConfig extends WebMvcConfigurationSupport{ @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping(); handlerMapping.setUseSuffixPatternMatch(false); handlerMapping.setUseTrailingSlashMatch(false); return handlerMapping; } } 

Uma maneira bem fácil de contornar esse problema é append uma barra à direita …

por exemplo:

usar :

 /somepath/filename.jpg/ 

ao invés de:

 /somepath/filename.jpg 

No Spring Boot, a expressão regular resolve o problema como

 @GetMapping("/path/{param1:.+}") 

A solução completa, incluindo endereços de e-mail em nomes de caminho para a primavera 4.2, é

      json=application/json xml=application/xml       

Adicione isto ao aplicativo-xml

Se você estiver usando Spring 3.2.xe , crie este pequeno BeanPostProcessor :

 package spring; public final class DoNotTruncateMyUrls implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof RequestMappingHandlerMapping) { ((RequestMappingHandlerMapping)bean).setUseSuffixPatternMatch(false); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } } 

Em seguida, coloque isso no seu xml de configuração do MVC: