带点(。)的Spring MVC @PathVariable正在被截断
这是Spring MVC @PathVariable被截断的问题的延续
Spring论坛指出它已经修复(3.2版本)作为ContentNegotiationManager的一部分。 请参阅下面的链接。
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632
在我的应用程序与.com的requestParameter被截断。
任何人都可以解释我如何使用这个新功能? 它如何在xml中配置?
注意:春季论坛 - #1 Spring MVC @PathVariable带点(。)正在被截断
据我所知,这个问题只出现在请求映射结尾的路径变量。
我们可以通过在requestmapping中定义正则表达式插件来解决这个问题。
/somepath/{variable:.+}
春认为,最后一个点后面的东西是作为文件扩展名, .json
或.xml
和trucate它来检索您的参数。
所以如果你有/somepath/{variable}
:
/somepath/param
, /somepath/param
/somepath/param.json
, /somepath/param
/somepath/param.xml
或/somepath/param.anything
将产生一个参数,其值为param
/somepath/param.value.json
, /somepath/param.value.xml
或/somepath/param.value.anything
将导致具有值的PARAM param.value
如果您按照建议将映射更改为/somepath/{variable:.+}
,则任何点(包括最后一个点)都将被视为参数的一部分:
/somepath/param
将产生一个param值为param
/somepath/param.json
将产生一个param值为param.json
的参数 /somepath/param.xml
将生成一个param值为param.xml
的参数 /somepath/param.anything
将产生一个param值为param.anything
的参数 /somepath/param.value.json
将产生一个param值为param.value.json
的参数 如果您不关心扩展识别,可以通过覆盖mvc:annotation-driven
来禁用它mvc:annotation-driven
automagic:
<bean id="handlerMapping"
class="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
/somepath/param.json
, /somepath/param
/somepath/param.xml
或/somepath/param.anything
将产生一个参数,其值为param
/somepath/param.value.json
, /somepath/param.value.xml
或/somepath/param.value.anything
将导致具有值的PARAM param.value
注意:只有在像somepath/something.{variable}
这样的映射somepath/something.{variable}
才能看到与默认配置的区别。 请参阅Resthub项目问题
如果你想保持扩展管理,从Spring 3.2开始,你也可以设置RequestMappingHandlerMapping bean的useRegisteredSuffixPatternMatch属性,以保持后缀模式识别的激活,但仅限于注册扩展。
在这里你只定义了json和xml扩展:
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useRegisteredSuffixPatternMatch" value="true"/>
</bean>
<bean id="contentNegotiationManager" 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:注释驱动的配置。 我打开了一张Spring的门票来请求一个自定义的RequestMappingHandlerMapping:https://jira.springsource.org/browse/SPR-11253。 如果你有相关的问题,请投票。
在压倒一切时,也要考虑自定义执行管理覆盖。 否则,您所有的自定义异常映射都将失败。 您将不得不重复使用带有列表bean的messageCoverters:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<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>
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
</bean>
我在Resthub的开源项目中实现了我对这些主题的一组测试:https github.com/resthub/resthub-spring-stack/issues/217
更新Spring 4:自4.0.1以来,您可以使用PathMatchConfigurer
(通过您的WebMvcConfigurer
),例如
@Configuration
protected static class AllResources extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
matcher.setUseRegisteredSuffixPatternMatch(true);
}
}
在xml中,它会是(https://jira.spring.io/browse/SPR-10163):
<mvc:annotation-driven>
[...]
<mvc:path-matching registered-suffixes-only="true"/>
</mvc:annotation-driven>
链接地址: http://www.djcxy.com/p/48485.html
上一篇: Spring MVC @PathVariable with dot (.) is getting truncated