带有点(。)的Spring MVC @PathVariable被截断

【字号: 日期:2024-02-25浏览:41作者:雯心
如何解决带有点(。)的Spring MVC @PathVariable被截断?

据我所知,这个问题只出现在requestmapping末尾的pathvariable中。

我们可以通过在requestmapping中定义regex插件来解决这一问题。

/somepath/{variable:.+}

Spring认为最后一个点后面的任何东西都是文件扩展名(例如.json或).xml,然后对其进行结构化以检索您的参数。

因此,如果您有/somepath/{variable}:

/somepath/param,/somepath/param.json,/somepath/param.xml或/somepath/param.anything将导致具有值的ParaMparam/somepath/param.value.json,/somepath/param.value.xml否则/somepath/param.value.anything将导致带有值的参数param.value

如果将映射更改/somepath/{variable:.+}为建议的值,则任何点(包括最后一个点)都将被视为参数的一部分:

/somepath/param 会带来有价值的参数 param/somepath/param.json会带来有价值的参数 param.json/somepath/param.xml 会带来有价值的参数 param.xml/somepath/param.anything会带来有价值的参数 param.anything/somepath/param.value.json 会带来有价值的参数 param.value.json…

如果您不关心扩展名识别,则可以通过覆盖mvc:annotation-drivenautomagic来禁用它:

<beanclass='org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping'> <property name='contentNegotiationManager' ref='contentNegotiationManager'/> <property name='useSuffixPatternMatch' value='false'/></bean>

因此,如果您有/somepath/{variable}:

/somepath/param,/somepath/param.json,/somepath/param.xml或/somepath/param.anything将导致具有值的ParaMparam

/somepath/param.value.json,/somepath/param.value.xml否则/somepath/param.value.anything将导致带有值的参数param.value注意:与默认配置的区别仅在有类似的映射时可见somepath/something.{variable}。

如果要保持扩展管理,从Spring 3.2开始,还可以设置RequestMappingHandlerMapping bean的useRegisteredSuffixPatternMatch属性,以保持激活suffixPattern识别,但仅限于已注册的扩展。

在这里,您仅定义json和xml扩展名:

<beanclass='org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping'> <property name='contentNegotiationManager' ref='contentNegotiationManager'/> <property name='useRegisteredSuffixPatternMatch' value='true'/></bean><bean class='org.springframework.web.accept.ContentNegotiationManagerfactorybean'> <property name='favorPathExtension' value='false'/> <property name='favorParameter' value='true'/> <property name='mediaTypes'><value> json=application/json xml=application/xml</value> </property></bean>

请注意,mvc:annotation-driven现在接受contentNegotiation选项以提供自定义bean,但必须将RequestMappingHandlerMapping的属性更改为true(默认为false)(参见https://jira.springsource.org/browse/SPR-7632)。

因此,您仍然必须覆盖所有mvc:annotation驱动的配置。我开了一张去Spring的票,要求自定义RequestMappingHandlerMapping:https : //jira.springsource.org/browse/SPR-11253。如果您感兴趣,请投票。

覆盖时,请谨慎考虑自定义执行管理覆盖。否则,所有自定义Exception映射将失败。您将必须使用list bean重用messageCoverters:

<bean /><bean /><util:list id='messageConverters'> <bean class='your.custom.message.converter.IfAny'></bean> <bean class='org.springframework.http.converter.ByteArrayHttpMessageConverter'></bean> <bean class='org.springframework.http.converter.StringHttpMessageConverter'></bean> <bean class='org.springframework.http.converter.ResourceHttpMessageConverter'></bean> <bean class='org.springframework.http.converter.xml.sourceHttpMessageConverter'></bean> <bean class='org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter'></bean> <bean class='org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter'></bean> <bean class='org.springframework.http.converter.json.MappingJacksonHttpMessageConverter'></bean></util:list><bean name='exceptionHandlerExceptionResolver' class='org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver'> <property name='order' value='0'/> <property name='messageConverters' ref='messageConverters'/></bean><bean name='handlerAdapter' class='org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter'> <property name='webBindingInitializer'><bean class='org.springframework.web.bind.support.ConfigurableWebBindingInitializer'> <property name='conversionService' ref='conversionService' /> <property name='validator' ref='validator' /></bean> </property> <property name='messageConverters' ref='messageConverters'/></bean><beanclass='org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping'></bean>

我在我参与的开源项目Resthub中实现了针对这些主题的一系列测试:请参阅https://github.com/resthub/resthub-spring-stack/pull/219/files和https:// github.com/resthub/resthub-spring-stack/issues/217

解决方法

Spring论坛指出,它已作为ContentNegotiationManager的一部分进行了修复(3.2版)。请参阅下面的链接。https://jira.springsource.org/browse/SPR-6164https://jira.springsource.org/browse/SPR-7632

在我的应用程序中,带有.com的requestParameter被截断了。

谁能解释我如何使用此新功能?如何在xml上进行配置?

注意:Spring论坛-#1带有点(。)的Spring MVC @PathVariable被截断

相关文章: