Spring ritiene che qualsiasi cosa dietro all'ultimo punto sia un'estensione di file come .json
o.xml
e la troncano per recuperare il parametro.
Quindi se hai /{blahName}
:
/param
, /param.json
, /param.xml
O /param.anything
si tradurrà in un param con un valoreparam
/param.value.json
, /param.value.xml
o /param.value.anything
risulterà in un parametro con valoreparam.value
Se modifichi la mappatura /{blahName:.+}
come suggerito, qualsiasi punto, incluso l'ultimo, verrà considerato come parte del tuo parametro:
/param
si tradurrà in un parametro con valore param
/param.json
si tradurrà in un parametro con 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 parametro con valore param.value.json
- ...
Se non ti interessa il riconoscimento delle estensioni, puoi disabilitarlo sovrascrivendo 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 hai /{blahName}
:
/param
, /param.json
, /param.xml
O /param.anything
si tradurrà in un param con un valoreparam
/param.value.json
, /param.value.xml
o /param.value.anything
risulterà in un parametro con valoreparam.value
Nota: la differenza dalla configurazione predefinita è visibile solo se si ha una mappatura simile /something.{blahName}
. Vedi il problema del progetto Resthub .
Se si desidera mantenere la gestione delle estensioni, dalla primavera 3.2 è inoltre possibile impostare la proprietà useRegisteredSuffixPatternMatch del bean RequestMappingHandlerMapping per mantenere il riconoscimento suffixPattern attivato ma limitato all'estensione registrata.
Qui definisci solo le estensioni json e 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>
Nota che mvc: annotation-driven ora accetta un'opzione contentNegotiation per fornire un bean personalizzato ma la proprietà di RequestMappingHandlerMapping deve essere cambiata in true (default false) (cfr. Https://jira.springsource.org/browse/SPR-7632 ).
Per questo motivo, devi ancora sovrascrivere tutta la configurazione guidata da mvc: annotation. Ho aperto un biglietto per Spring per chiedere un RequestMappingHandlerMapping personalizzato: https://jira.springsource.org/browse/SPR-11253 . Si prega di votare se si è interessati.
Durante l'override, fare attenzione a considerare anche l'override della gestione dell'esecuzione personalizzata. In caso contrario, tutte le mappature delle eccezioni personalizzate avranno esito negativo. Dovrai riutilizzare messageCoverters con un bean di elenco:
<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 di cui faccio parte, 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