Spring considera que cualquier cosa que esté detrás del último punto es una extensión de archivo como .json
o .xml
y trunque para recuperar su parámetro.
Así que si usted tiene /{blahName}
:
/param
, /param.json
, /param.xml
o /param.anything
se traducirá en un parámetro con el valor param
/param.value.json
, /param.value.xml
o /param.value.anything
se traducirá en un parámetro con el valor param.value
Si cambia su asignación a /{blahName:.+}
como se sugiere, cualquier punto, incluyendo el último, se considerará como parte de su parámetro:
/param
se traducirá en un parámetro con el valor param
/param.json
se traducirá en un parámetro con el valor param.json
/param.xml
resultará en un parámetro con valor param.xml
/param.anything
resultará en un parámetro con valor param.anything
/param.value.json
se traducirá en un parámetro con el valor param.value.json
- ...
Si no se preocupan de reconocimiento de extensión, se puede desactivar anulando 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>
Por lo tanto, de nuevo, si usted tiene /{blahName}
:
/param
,.210, /param.xml
o /param.anything
se traducirá en un parámetro con el valor param
/param.value.json
, /param.value.xml
o /param.value.anything
se traducirá en un parámetro con el valor param.value
Nota: la diferencia de la configuración por defecto es visible sólo si tiene una mapeo como /something.{blahName}
. Ver Resthub project issue.
Si desea mantener la administración de extensiones, desde Spring 3.2 también puede establecer la propiedad useRegisteredSuffixPatternMatch de bean RequestMappingHandlerMapping para mantener activado el reconocimiento sufijoPattern pero limitado a la extensión registrada.
Aquí se define sólo JSON y XML extensiones:
<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>
Tenga en cuenta que mvc: anotación impulsada acepta ahora una opción contentNegotiation para proporcionar un grano de costumbre, pero la propiedad de RequestMappingHandlerMapping tiene que ser cambiado a true (predeterminado falso) (compárese con https://jira.springsource.org/browse/SPR-7632).
Por ese motivo, aún debe sobrescribir toda la configuración de mvc: anotación.Abrí un boleto a Spring para solicitar un CustomMappingHandlerMapping personalizado: https://jira.springsource.org/browse/SPR-11253. Por favor, vote si le interesa.
Al anular, tenga en cuenta también la anulación de gestión de ejecución personalizada. De lo contrario, todas las asignaciones de excepciones personalizadas fallarán. Tendrá que volver a utilizar messageCoverters con una lista de frijol:
<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>
he implementado, en el proyecto de código abierto Resthub que soy parte de un conjunto de pruebas sobre estos temas: ver https://github.com/resthub/resthub-spring-stack/pull/219/files y https://github.com/resthub/resthub-spring-stack/issues/217
Parece que esto ha sido resuelto en la primavera de 3,2-M2: ver [Permitir caminos de extensión de archivo válidos para la negociación de contenido por especificar] (https://jira.springsource.org/browse/SPR-7632) y [su documentación] (http://static.springsource.org/spring/docs/3.2.0.M2/reference/htmlsingle/# mvc-config-content-negotiation). – Arjan