Spring вважає, що все, що стоїть за останньою крапкою, є розширенням файлу, таким як .json
або .xml
і усікає його, щоб отримати ваш параметр.
Тож якщо у вас є /{blahName}
:
/param
, /param.json
, /param.xml
Або /param.anything
призведе до парам із значеннямparam
/param.value.json
, /param.value.xml
або /param.value.anything
призведе до параметри зі значеннямparam.value
Якщо ви зміните своє відображення на /{blahName:.+}
запропоноване, будь-яка крапка, включаючи останню, буде вважатися частиною вашого параметра:
/param
призведе до парам із значенням param
/param.json
призведе до парам із значенням param.json
/param.xml
призведе до парам із значенням param.xml
/param.anything
призведе до парам із значенням param.anything
/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>
Отже, знову ж таки, якщо у вас є /{blahName}
:
/param
, /param.json
, /param.xml
Або /param.anything
призведе до парам із значеннямparam
/param.value.json
, /param.value.xml
або /param.value.anything
призведе до параметри зі значеннямparam.value
Примітка: відмінність від конфігурації за замовчуванням видно лише у випадку, якщо у вас є подібне відображення /something.{blahName}
. Дивіться випуск проекту Resthub .
Якщо ви хочете зберегти управління розширеннями, починаючи з весни 3.2, ви також можете встановити властивість useRegisteredSuffixPatternMatch ReanMappingHandlerMapping, щоб зберегти розпізнавання суфікса активізованим, але обмеженим зареєстрованим розширенням.
Тут ви визначаєте лише розширення 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