Spring menganggap bahwa apa pun di belakang titik terakhir adalah ekstensi file seperti .json
atau .xml
dan buatkan itu untuk mengambil parameter Anda.
Jadi, jika Anda memiliki /somepath/{variable}
:
/somepath/param
, /somepath/param.json
, /somepath/param.xml
Atau /somepath/param.anything
akan menghasilkan param dengan nilaiparam
/somepath/param.value.json
, /somepath/param.value.xml
atau /somepath/param.value.anything
akan menghasilkan param dengan nilaiparam.value
jika Anda mengubah pemetaan menjadi /somepath/{variable:.+}
seperti yang disarankan, sembarang titik, termasuk yang terakhir akan dianggap sebagai bagian dari parameter Anda:
/somepath/param
akan menghasilkan param dengan nilai param
/somepath/param.json
akan menghasilkan param dengan nilai param.json
/somepath/param.xml
akan menghasilkan param dengan nilai param.xml
/somepath/param.anything
akan menghasilkan param dengan nilai param.anything
/somepath/param.value.json
akan menghasilkan param dengan nilai param.value.json
- ...
Jika Anda tidak peduli dengan pengenalan ekstensi, Anda dapat menonaktifkannya dengan menimpa 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 /somepath/{variable}
:
/somepath/param
, /somepath/param.json
, /somepath/param.xml
Atau /somepath/param.anything
akan menghasilkan param dengan nilaiparam
/somepath/param.value.json
, /somepath/param.value.xml
atau /somepath/param.value.anything
akan menghasilkan param dengan nilaiparam.value
Catatan: perbedaan dari konfigurasi default hanya terlihat jika Anda memiliki pemetaan seperti somepath/something.{variable}
. 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 suffixPengenalan pola makan diaktifkan tetapi terbatas pada ekstensi yang 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 ).
Untuk alasan 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 diinteret masuk.
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 & https: // github.com/resthub/resthub-spring-stack/issues/217