Printemps considère que quoi que ce soit derrière le dernier point est une extension de fichier tels que .json
ou .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