395 votes

Spring MVC @PathVariable avec point (.) est obtenir tronquée

C'est la suite de la question Spring MVC @PathVariable obtention tronqués

Printemps états membres du forum qu'il a fixe(version 3.2) dans le cadre de ContentNegotiationManager. voir le lien ci-dessous.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632

Dans mon application requestParameter avec .com est tronqué.

Quelqu'un pourrait-il m'expliquer comment utiliser cette nouvelle fonctionnalité? comment est-il configurable à xml?

Note:

http://forum.springsource.org/showthread.php?137000-Spring-MVC-PathVariable-with-dot-(-)-is-getting-truncated&p=444607#post444607

511voto

Martin Frey Points 1751

Autant que je sache ce problème apparaît uniquement pour le pathvariable à la fin de la requestmapping.

Nous avons pu résoudre qu’en définissant l’addon de regex dans la requestmapping.

255voto

bmeurant Points 517

Printemps considère que quoi que ce soit derrière le dernier point est une extension de fichier tels que .jsonou .xml et trucate pour récupérer votre paramètre.

Donc, si vous avez /somepath/{variable} :

  • /somepath/param, /somepath/param.json, /somepath/param.xml ou /somepath/param.anything entraînera un paramètre avec la valeur param
  • /somepath/param.value.json, /somepath/param.value.xml ou /somepath/param.value.anything entraînera un paramètre avec la valeur param.value

si vous modifiez votre mappage /somepath/{variable:.+} , comme l'a suggéré, en tout point, y compris la dernière sera considérer comme une partie de votre paramètre :

  • /somepath/param entraînera un paramètre avec la valeur param
  • /somepath/param.json entraînera un paramètre avec la valeur param.json
  • /somepath/param.xml entraînera un paramètre avec la valeur param.xml
  • /somepath/param.anything entraînera un paramètre avec la valeur param.anything
  • /somepath/param.value.json entraînera un paramètre avec la valeur param.value.json
  • ...

Si vous ne vous souciez pas de l'extension de la reconnaissance, vous pouvez le désactiver en substituant 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>

Donc, encore une fois, si vous avez /somepath/{variable} :

  • /somepath/param, /somepath/param.json, /somepath/param.xml ou /somepath/param.anything entraînera un paramètre avec la valeur param
  • /somepath/param.value.json, /somepath/param.value.xml ou /somepath/param.value.anything entraînera un paramètre avec la valeur param.value

remarque : la différence de la configuration par défaut n'est visible que si vous avez une cartographie comme somepath/something.{variable}. voir Resthub projet de problème

si vous souhaitez conserver l'extension de la gestion, depuis le Printemps 3.2 vous pouvez également définir la useRegisteredSuffixPatternMatch propriété de RequestMappingHandlerMapping bean afin de garder suffixPattern reconnaissance activé, mais limitée à un régime enregistré d'extension.

Ici, vous définissez uniquement json et xml extensions :

<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>

Notez que mvc:annotation-driven accepte maintenant un contentNegotiation option pour fournir une coutume bean, mais la propriété de RequestMappingHandlerMapping doit être changé à true (false par défaut) (cf. https://jira.springsource.org/browse/SPR-7632).

Pour cette raison, vous devez toujours remplacer les tous mvc:annotation-driven configuration. J'ai ouvert un ticket pour le Printemps de demander une coutume RequestMappingHandlerMapping : https://jira.springsource.org/browse/SPR-11253. Merci de voter si vous êtes intereted.

Bien que primordial, attention aussi prendre en compte personnalisée de l'Exécution de la gestion primordial. Sinon, tous vos Exception personnalisée mappages échouera. Vous devrez réutiliser messageCoverters avec une liste de haricot :

<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>

J'ai mis en place, dans le projet open source Resthub que je suis partie, une série de tests sur ces sujets : voir https://github.com/resthub/resthub-spring-stack/pull/219/files et https://github.com/resthub/resthub-spring-stack/issues/217

98voto

Dave Syer Points 9749

Mise à jour pour le Printemps 4: depuis la 4.0.1, vous pouvez utiliser PathMatchConfigurer (par l'intermédiaire de votre WebMvcConfigurer), par ex.

@Configuration
protected static class AllResources extends WebMvcConfigurerAdapter {

    @Override
    public void configurePathMatch(PathMatchConfigurer matcher) {
        matcher.setUseRegisteredSuffixPatternMatch(true);
    }

}

En xml, il serait (https://jira.spring.io/browse/SPR-10163):

<mvc:annotation-driven>
    [...]
    <mvc:path-matching registered-suffixes-only="true"/>
</mvc:annotation-driven>

88voto

Michał Rybak Points 4492

En plus de la réponse de Martin Frey, ceci peut également être corrigé en ajoutant une barre oblique dans la valeur RequestMapping:

 /path/{variable}/
 

5voto

Jukka Points 2719

Si vous utilisez Spring 3.2.x et <mvc:annotation-driven /> , créez ce petit 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;
    }
}
 

Puis mettez ceci dans votre XML MVC config:

 <bean class="spring.DoNotTruncateMyUrls" />
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X