Spring xem xét rằng bất cứ điều gì đằng sau dấu chấm cuối cùng là một phần mở rộng tệp như .json
hoặc .xml
cắt bớt nó để lấy tham số của bạn.
Vì vậy, nếu bạn có /{blahName}
:
/param
, /param.json
, /param.xml
Hoặc /param.anything
sẽ dẫn đến một param với giá trịparam
/param.value.json
, /param.value.xml
Hoặc /param.value.anything
sẽ dẫn đến một param với giá trịparam.value
Nếu bạn thay đổi ánh xạ của mình thành /{blahName:.+}
như được đề xuất, bất kỳ dấu chấm nào, kể cả dấu chấm cuối cùng, sẽ được coi là một phần của tham số của bạn:
/param
sẽ dẫn đến một param có giá trị param
/param.json
sẽ dẫn đến một param có giá trị param.json
/param.xml
sẽ dẫn đến một param có giá trị param.xml
/param.anything
sẽ dẫn đến một param có giá trị param.anything
/param.value.json
sẽ dẫn đến một param có giá trị param.value.json
- ...
Nếu bạn không quan tâm đến nhận dạng tiện ích mở rộng, bạn có thể vô hiệu hóa nó bằng cách ghi đè mvc:annotation-driven
tự động:
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useSuffixPatternMatch" value="false"/>
</bean>
Vì vậy, một lần nữa, nếu bạn có /{blahName}
:
/param
, /param.json
, /param.xml
Hoặc /param.anything
sẽ dẫn đến một param với giá trịparam
/param.value.json
, /param.value.xml
Hoặc /param.value.anything
sẽ dẫn đến một param với giá trịparam.value
Lưu ý: sự khác biệt so với cấu hình mặc định chỉ hiển thị nếu bạn có ánh xạ như /something.{blahName}
. Xem vấn đề dự án Resthub .
Nếu bạn muốn duy trì quản lý tiện ích mở rộng, kể từ Spring 3.2, bạn cũng có thể đặt thuộc tính useRegisteredSuffixPotypeMatch của bean RequestMappingHandlerMapping để giữ cho nhận dạng hậu tố được kích hoạt nhưng giới hạn ở tiện ích mở rộng đã đăng ký.
Ở đây bạn chỉ xác định các phần mở rộng json và 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>
Lưu ý rằng mvc: điều khiển chú thích chấp nhận ngay bây giờ tùy chọn contentNegotiation để cung cấp một bean tùy chỉnh nhưng thuộc tính của RequestMappingHandlerMapping phải được thay đổi thành true (false default) (xem https://jira.springsource.org/browse/SPR-7632 ).
Vì lý do đó, bạn vẫn phải ghi đè tất cả cấu hình điều khiển mvc: annotation. Tôi đã mở một vé đến Spring để yêu cầu một RequestMappingHandlerMapping tùy chỉnh: https://jira.springsource.org/browse/SPR-11253 . Hãy bỏ phiếu nếu bạn quan tâm.
Trong khi ghi đè, hãy cẩn thận để xem xét ghi đè quản lý Thực thi tùy chỉnh. Nếu không, tất cả các ánh xạ Ngoại lệ tùy chỉnh của bạn sẽ thất bại. Bạn sẽ phải sử dụng lại MessageCoverters với danh sách 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>
Tôi đã triển khai, trong dự án mã nguồn mở Resthub mà tôi là một phần của một tập hợp các bài kiểm tra về các chủ đề này: xem https://github.com/resthub/resthub-spring-stack/pull/219/files và https: // github.com/resthub/resthub-spring-stack/issues/217