Spring ritiene che qualsiasi elemento dietro l'ultimo punto sia un'estensione di file come .json
o .xml
e lo tronca per recuperare il parametro.
Quindi, se avete /{blahName}
:
/param
, /param.json
, /param.xml
o /param.anything
si tradurrà in un param con un valore param
/param.value.json
, /param.value.xml
o /param.value.anything
si tradurrà in un param con un valore param.value
Se si modifica la mappatura su /{blahName:.+}
come suggerito, qualsiasi punto, compreso l'ultimo, sarà considerata come parte del vostro parametro:
/param
si tradurrà in un param con un valore param
/param.json
si tradurrà in un param con un valore param.json
/param.xml
si tradurrà in un parametro con valore param.xml
/param.anything
si tradurrà in un parametro con valore param.anything
/param.value.json
si tradurrà in un param con un valore param.value.json
- ...
Se non si cura del riconoscimento di estensione, è possibile disattivarla mediante l'override 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>
Quindi, ancora una volta, se avete /{blahName}
:
/param
, /param.json
, /param.xml
o /param.anything
si tradurrà in un param con un valore param
/param.value.json
, /param.value.xml
o /param.value.anything
si tradurrà in un param con un valore param.value
Nota: la differenza dalla configurazione di default è visibile solo se si dispone di un mappatura come /something.{blahName}
. Vedi Resthub project issue.
Se si desidera mantenere la gestione delle estensioni, dalla primavera 3.2 è anche possibile impostare la proprietà useRegisteredSuffixPatternMatch del bean RequestMappingHandlerMapping per mantenere il riconoscimento suffixPattern attivato ma limitato all'estensione registrata.
Qui si definisce solo JSON e XML estensioni:
<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>
Nota che MVC: annotazione-driven accetta ora un'opzione contentNegotiation per fornire un fagiolo personalizzato ma la proprietà di RequestMappingHandlerMapping deve essere cambiato a true (predefinito falso) (vedi https://jira.springsource.org/browse/SPR-7632).
Per questo motivo, è comunque necessario eseguire l'override di tutte le mvc: configurazione basata su annotazione.Ho aperto un biglietto per Spring per richiedere un Custom RequestMappingHandlerMapping: https://jira.springsource.org/browse/SPR-11253. Si prega di votare se si è interessati a.
Mentre si esegue l'override, fare attenzione a considerare anche l'esecuzione prioritaria della gestione Esecuzione personalizzata. In caso contrario, tutti i mapping delle eccezioni personalizzati avranno esito negativo. Si dovrà riutilizzare messageCoverters con una lista di fagioli:
<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>
ho implementato, nel progetto open source Resthub che io sono parte di una serie di test su questi argomenti: vedi https://github.com/resthub/resthub-spring-stack/pull/219/files e https://github.com/resthub/resthub-spring-stack/issues/217
Sembra che questo è stato risolto nella primavera del 3,2-M2: vedi [Consenti percorsi di estensione di file validi per la negoziazione dei contenuti da specificare] (https://jira.springsource.org/browse/SPR-7632) e [la sua documentazione] (http://static.springsource.org/spring/docs/3.2.0.M2/reference/htmlsingle/# MVC-config-content-negoziazione). – Arjan