Spring menganggap bahwa apa pun di belakang titik terakhir adalah ekstensi file seperti .json
atau .xml
dan memotongnya untuk mengambil parameter Anda.
Jadi, jika Anda memiliki /{blahName}
:
/param
, /param.json
, /param.xml
Atau /param.anything
akan menghasilkan param dengan nilaiparam
/param.value.json
, /param.value.xml
atau /param.value.anything
akan menghasilkan param dengan nilaiparam.value
Jika Anda mengubah pemetaan menjadi /{blahName:.+}
seperti yang disarankan, titik apa pun, termasuk yang terakhir, akan dianggap sebagai bagian dari parameter Anda:
/param
akan menghasilkan param dengan nilai param
/param.json
akan menghasilkan param dengan nilai param.json
/param.xml
akan menghasilkan param dengan nilai param.xml
/param.anything
akan menghasilkan param dengan nilai param.anything
/param.value.json
akan menghasilkan param dengan nilai param.value.json
- ...
Jika Anda tidak peduli dengan pengenalan ekstensi, Anda dapat menonaktifkannya dengan mengesampingkan 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>
Jadi, sekali lagi, jika Anda memiliki /{blahName}
:
/param
, /param.json
, /param.xml
Atau /param.anything
akan menghasilkan param dengan nilaiparam
/param.value.json
, /param.value.xml
atau /param.value.anything
akan menghasilkan param dengan nilaiparam.value
Catatan: perbedaan dari konfigurasi default hanya terlihat jika Anda memiliki pemetaan seperti /something.{blahName}
. Lihat masalah proyek Resthub .
Jika Anda ingin mempertahankan manajemen ekstensi, sejak Spring 3.2 Anda juga dapat mengatur properti useRegisteredSuffixPatternMatch dari RequestMappingHandlerMapping bean untuk menjaga suffixPattern pengenalan diaktifkan tetapi terbatas pada ekstensi terdaftar.
Di sini Anda hanya mendefinisikan ekstensi json dan 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>
Perhatikan bahwa mvc: annotation-driven menerima sekarang opsi contentNegotiation untuk menyediakan kacang kustom tetapi properti dari RequestMappingHandlerMapping harus diubah menjadi true (default false) (lih. Https://jira.springsource.org/browse/SPR-7632 ).
Karena itu, Anda masih harus mengganti semua konfigurasi mvc: annotation-driven. Saya membuka tiket ke Spring untuk meminta RequestMappingHandlerMapping kustom: https://jira.springsource.org/browse/SPR-11253 . Berikan suara jika Anda tertarik.
Sementara mengesampingkan, berhati-hatilah untuk mempertimbangkan juga menimpa manajemen Eksekusi kustom. Jika tidak, semua pemetaan Pengecualian khusus Anda akan gagal. Anda harus menggunakan kembali messageCoverters dengan daftar kacang:
<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>
Saya menerapkan, dalam proyek open source Resthub yang menjadi bagian saya, serangkaian tes pada subjek ini: lihat https://github.com/resthub/resthub-spring-stack/pull/219/files dan https: // github.com/resthub/resthub-spring-stack/issues/217