Tengo un controlador que proporciona acceso RESTful a la información:
@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")
public ModelAndView getBlah(@PathVariable String blahName, HttpServletRequest request,
HttpServletResponse response) {
El problema que estoy experimentando es que si golpeo el servidor con una variable de ruta con caracteres especiales, se trunca. Por ejemplo: http: // localhost: 8080 / blah-server / blah / get / blah2010.08.19-02: 25: 47
El parámetro blahName será blah2010.08
Sin embargo, la llamada a request.getRequestURI () contiene toda la información que se pasa.
¿Alguna idea de cómo evitar que Spring trunca el @PathVariable?
Respuestas:
Pruebe con una expresión regular para el
@RequestMapping
argumento:fuente
Esto probablemente esté estrechamente relacionado con SPR-6164 . Brevemente, el marco intenta aplicar algunos conocimientos a la interpretación de URI, eliminando lo que cree que son extensiones de archivo. Esto tendría el efecto de convertirse
blah2010.08.19-02:25:47
enblah2010.08
, ya que cree que.19-02:25:47
es una extensión de archivo.Como se describe en el problema vinculado, puede deshabilitar este comportamiento declarando su propio
DefaultAnnotationHandlerMapping
bean en el contexto de la aplicación y estableciendo suuseDefaultSuffixPattern
propiedad enfalse
. Esto anulará el comportamiento predeterminado y evitará que moleste sus datos.fuente
RequestMappingHandlerMapping
, la propiedad para establecer esuseSuffixPatternMatch
(también parafalse
). @Ted: el problema vinculado menciona que en 3.2 esperan agregar un poco más de control para que no tenga que ser todo o nada.WebMvcConfigurationSupport
que proporciona un enlace simple:public void configurePathMatch(PathMatchConfigurer configurer)
simplemente anule eso y configure la ruta que coincida como desee.Spring considera que cualquier cosa detrás del último punto es una extensión de archivo como
.json
o.xml
y truncarlo para recuperar su parámetro.Entonces si tienes
/{blahName}
:/param
,/param.json
,/param.xml
O/param.anything
dará lugar a un parámetro con el valorparam
/param.value.json
,/param.value.xml
o/param.value.anything
dará como resultado un parámetro con valorparam.value
Si cambia la asignación a
/{blahName:.+}
lo sugerido, cualquier punto, incluido el último, se considerará parte de su parámetro:/param
resultará en un parámetro con valorparam
/param.json
resultará en un parámetro con valorparam.json
/param.xml
resultará en un parámetro con valorparam.xml
/param.anything
resultará en un parámetro con valorparam.anything
/param.value.json
resultará en un parámetro con valorparam.value.json
Si no le importa el reconocimiento de extensiones, puede deshabilitarlo anulando el
mvc:annotation-driven
autómata:Entonces, de nuevo, si tienes
/{blahName}
:/param
,/param.json
,/param.xml
O/param.anything
dará lugar a un parámetro con el valorparam
/param.value.json
,/param.value.xml
o/param.value.anything
dará como resultado un parámetro con valorparam.value
Nota: la diferencia con la configuración predeterminada es visible solo si tiene una asignación como
/something.{blahName}
. Ver problema del proyecto Resthub .Si desea mantener la administración de extensiones, desde Spring 3.2 también puede establecer la propiedad useRegisteredSuffixPatternMatch del bean RequestMappingHandlerMapping para mantener activado el reconocimiento de sufijoPattern pero limitado a la extensión registrada.
Aquí solo define las extensiones json y xml:
Tenga en cuenta que mvc: impulsado por anotaciones acepta ahora una opción contentNegotiation para proporcionar un bean personalizado, pero la propiedad de RequestMappingHandlerMapping debe cambiarse a verdadero (valor predeterminado falso) (cf. https://jira.springsource.org/browse/SPR-7632 )
Por esa razón, aún debe anular toda la configuración mvc: basada en anotaciones. Abrí un boleto a Spring para solicitar un RequestMappingHandlerMapping personalizado: https://jira.springsource.org/browse/SPR-11253 . Por favor vote si le interesa.
Al anular, tenga cuidado de considerar también la anulación de la gestión de ejecución personalizada. De lo contrario, todas sus asignaciones de excepción personalizadas fallarán. Deberá reutilizar messageCoverters con un bean de lista:
Implementé, en el proyecto de código abierto Resthub del que formo parte, un conjunto de pruebas sobre estos temas: consulte https://github.com/resthub/resthub-spring-stack/pull/219/files y https: // github.com/resthub/resthub-spring-stack/issues/217
fuente
Todo después del último punto se interpreta como extensión de archivo y se corta de manera predeterminada.
En su spring config xml puede agregar
DefaultAnnotationHandlerMapping
y configuraruseDefaultSuffixPattern
afalse
(el valor predeterminado estrue
).Entonces abra su spring xml
mvc-config.xml
(o como se llame) y agregueAhora tu
@PathVariable
blahName
(y todos los demás también) debe contener el nombre completo, incluidos todos los puntos.EDITAR: Aquí hay un enlace a la API de primavera
fuente
<mvc:annotation-driven />
si corresponde.También me encontré con el mismo problema, y establecer la propiedad en falso tampoco me ayudó. Sin embargo, la API dice :
Intenté agregar "/ end" a mi URL RESTful, y el problema desapareció. No estoy satisfecho con la solución, pero funcionó.
Por cierto, no sé qué pensaban los diseñadores de Spring cuando agregaron esta "característica" y luego la activaron de manera predeterminada. En mi humilde opinión, debe ser eliminado.
fuente
Usando la clase de configuración correcta de Java:
fuente
Resolví por este truco
1) Se agregó HttpServletRequest en @PathVariable como a continuación
2) Obtenga la URL directamente (en este nivel sin truncamiento) en la solicitud
Spring MVC @PathVariable con punto (.) Se está truncando
fuente
Me encontré con esto y las soluciones aquí generalmente no funcionaron como esperaba.
Sugiero usar una expresión SpEL y múltiples asignaciones, por ejemplo
fuente
El problema de extensión de archivo solo existe si el parámetro está en la última parte de la URL. Cambio
a
y todo estará bien otra vez
fuente
Si puede editar la dirección a la que se envían las solicitudes, una solución simple sería agregarles una barra diagonal (y también en el
@RequestMapping
valor):entonces el mapeo se vería así:
Consulte también Spring MVC @PathVariable con punto (.) Se está truncando .
fuente
fuente
agregar el ":. +" funcionó para mí, pero no hasta que eliminé los corchetes externos.
value = {"/username/{id:.+}"}
no funcionóvalue = "/username/{id:.+}"
trabajosEspero haber ayudado a alguien:]
fuente
Solución de configuración basada en Java para evitar el truncamiento (utilizando una clase no obsoleta):
Fuente: http://www.javacodegeeks.com/2013/01/spring-mvc-customizing-requestmappinghandlermapping.html
ACTUALIZAR:
Me di cuenta de que tenía algunos problemas con la configuración automática de Spring Boot cuando utilicé el enfoque anterior (algunas configuraciones automáticas no son efectivas).
En cambio, comencé a usar el
BeanPostProcessor
enfoque. Parecía estar funcionando mejor.Inspirado en: http://ronaldxq.blogspot.com/2014/10/spring-mvc-setting-alwaysusefullpath-on.html
fuente
si está seguro de que su texto no coincidirá con ninguna de las extensiones predeterminadas, puede usar el siguiente código:
fuente
Mi solución preferible para evitar que Spring MVC @PathVariable se trunca es agregar una barra diagonal final al final de la variable de ruta.
Por ejemplo:
Entonces, la solicitud se verá así:
fuente
El problema que enfrenta se debe a que Spring interpreta la última parte de la uri después del punto (.) Como una extensión de archivo como .json o .xml. Entonces, cuando spring intenta resolver la variable de ruta, simplemente trunca el resto de los datos después de encontrar un punto (.) Al final de la uri. Nota: esto también sucede solo si mantiene la variable de ruta al final de la uri.
Por ejemplo, considere uri: https: //localhost/example/gallery.df/link.ar
En la url anterior firstValue = "gallery.df" y secondValue = "link", el último bit después de. se trunca cuando se interpreta la variable de ruta.
Entonces, para evitar esto, hay dos formas posibles:
1.) Usando un mapeo regexp
Use una expresión regular al final de la asignación
Al usar +, indicamos que cualquier valor después del punto también será parte de la variable de ruta.
2.) Agregar una barra al final de nuestro @PathVariable
Esto incluirá nuestra segunda variable protegiéndola del comportamiento predeterminado de Spring.
3) Al anular la configuración predeterminada de Spring webmvc
Spring proporciona formas de anular las configuraciones predeterminadas que se importan utilizando las anotaciones @EnableWebMvc. Podemos personalizar la configuración de Spring MVC declarando nuestro propio bean DefaultAnnotationHandlerMapping en el contexto de la aplicación y estableciendo su propiedad useDefaultSuffixPattern en falso. Ejemplo:
Tenga en cuenta que anular esta configuración predeterminada afecta a todas las URL.
Nota: aquí estamos ampliando la clase WebMvcConfigurationSupport para anular los métodos predeterminados. Hay una forma más de anular las configuraciones predeterminadas mediante la implementación de la interfaz WebMvcConfigurer. Para obtener más detalles sobre esto, lea: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html
fuente