สปริงพิจารณาว่าอะไรก็ตามที่อยู่หลังจุดสุดท้ายคือนามสกุลไฟล์เช่น.json
หรือ.xml
และคำนวณมันเพื่อดึงพารามิเตอร์ของคุณ
ดังนั้นถ้าคุณมี/somepath/{variable}
:
/somepath/param
, /somepath/param.json
, /somepath/param.xml
หรือ/somepath/param.anything
จะมีผลในพารามิเตอร์ที่มีค่าparam
/somepath/param.value.json
, /somepath/param.value.xml
หรือ/somepath/param.value.anything
จะมีผลในพารามิเตอร์ที่มีค่าparam.value
หากคุณเปลี่ยนการจับคู่ของคุณ/somepath/{variable:.+}
เป็นจุดที่แนะนำรวมถึงจุดสุดท้ายจะถูกพิจารณาเป็นส่วนหนึ่งของพารามิเตอร์ของคุณ:
/somepath/param
จะส่งผลให้พารามิเตอร์มีค่า param
/somepath/param.json
จะส่งผลให้พารามิเตอร์มีค่า param.json
/somepath/param.xml
จะส่งผลให้พารามิเตอร์มีค่า param.xml
/somepath/param.anything
จะส่งผลให้พารามิเตอร์มีค่า param.anything
/somepath/param.value.json
จะส่งผลให้พารามิเตอร์มีค่า param.value.json
- ...
หากคุณไม่สนใจการรู้จำส่วนขยายคุณสามารถปิดการใช้งานได้ด้วยการเอาชนะ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>
ดังนั้นถ้าคุณมีอีกครั้ง /somepath/{variable}
:
/somepath/param
, /somepath/param.json
, /somepath/param.xml
หรือ/somepath/param.anything
จะมีผลในพารามิเตอร์ที่มีค่าparam
/somepath/param.value.json
, /somepath/param.value.xml
หรือ/somepath/param.value.anything
จะมีผลในพารามิเตอร์ที่มีค่าparam.value
หมายเหตุ: ความแตกต่างจากการกำหนดค่าเริ่มต้นจะปรากฏเฉพาะเมื่อคุณมีการจับคู่เช่น somepath/something.{variable}
ความแตกต่างจากการตั้งค่าเริ่มต้นจะมองเห็นได้เฉพาะถ้าคุณมีการทำแผนที่เช่น เห็นปัญหาโครงการ Resthub
ถ้าคุณต้องการเก็บการจัดการส่วนขยายไว้ตั้งแต่ Spring 3.2 คุณสามารถตั้งค่าคุณสมบัติ useRegisteredSuffixPatternMatch ของ RequestMappingHandlerMapping bean เพื่อให้การรับรู้ suffixPattern เปิดใช้งาน แต่ จำกัด เฉพาะส่วนขยายที่ลงทะเบียนไว้
ที่นี่คุณกำหนดเฉพาะส่วนขยาย json และ 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>
โปรดทราบว่า mvc: ขับเคลื่อนด้วยคำอธิบายประกอบยอมรับตอนนี้เป็นตัวเลือก contentNegotiation เพื่อให้ถั่วที่กำหนดเอง แต่คุณสมบัติของ RequestMappingHandlerMapping จะต้องเปลี่ยนเป็นจริง (เท็จเริ่มต้น) (cf https://jira.springsource.org/browse/SPR-7632 )
ด้วยเหตุผลดังกล่าวคุณยังคงต้องแทนที่การกำหนดค่าที่ขับเคลื่อนด้วยคำอธิบายประกอบ mvc ทั้งหมด ฉันเปิดตั๋วไป Spring เพื่อขอ RequestMappingHandlerMapping ที่กำหนดเอง: https://jira.springsource.org/browse/SPR-11253 โปรดลงคะแนนถ้าคุณถูกขัดจังหวะ
ในขณะที่การเอาชนะโปรดระมัดระวังในการพิจารณาการจัดการ Execution แบบกำหนดเองด้วย มิฉะนั้นการแมปข้อยกเว้นที่กำหนดเองทั้งหมดของคุณจะล้มเหลว คุณจะต้องใช้ messageCoverters ใหม่ด้วย list bean:
<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>
ฉันดำเนินการในResthub project แบบโอเพนซอร์สที่ฉันเป็นส่วนหนึ่งของชุดการทดสอบในหัวข้อเหล่านี้: ดูhttps://github.com/resthub/resthub-spring-stack/pull/219/files & https: // github.com/resthub/resthub-spring-stack/issues/217