带点(。)的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

    下一篇: Spring rest api filter fields in the response