Spring вважає, що все, що стоїть за останньою крапкою, є розширенням файлу, таким як .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
автоматичне:
<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
якщо ви хочете зберегти управління розширеннями, починаючи з весни 3.2, ви також можете встановити властивість useRegisteredSuffixPatternMatch ReanMappingHandlerMapping bean, щоб зберегти розпізнавання суфіксаPattern активованим, але обмежено зареєстрованим розширенням.
Тут ви визначаєте лише розширення 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: annotation-керування приймає тепер параметр contentNegotiation для надання користувальницького біна, але властивість RequestMappingHandlerMapping має бути змінено на true (за замовчуванням false) (див. Https://jira.springsource.org/browse/SPR-7632 ).
З цієї причини вам все одно доведеться перекрити всю конфігурацію mvc: анотації. Я відкрив квиток на Весну, щоб попросити власну RequestMappingHandlerMapping: https://jira.springsource.org/browse/SPR-11253 . Будь ласка, голосуйте, якщо вас цікавлять.
Будучи обережними, будьте обережні, враховуйте також переорієнтування на користувальницьке управління виконанням. Інакше всі ваші власні відображення винятків не вдасться. Вам доведеться повторно використовувати messageCoverters зі списком:
<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, до якого я входять, набір тестів з цих предметів: див. Https://github.com/resthub/resthub-spring-stack/pull/219/files & https: // github.com/resthub/resthub-spring-stack/isissue/217