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 .
Если вы хотите сохранить управление расширениями, начиная с Spring 3.2, вы также можете установить свойство useRegisteredSuffixPatternMatch bean-компонента RequestMappingHandlerMapping, чтобы поддерживать распознавание суффикс-паттерна активированным, но ограниченным зарегистрированным расширением.
Здесь вы определяете только расширения 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 должно быть изменено на true (по умолчанию false) (см. Https://jira.springsource.org/browse/SPR-7632 ).
По этой причине вам все равно придется переопределить всю конфигурацию, управляемую mvc: annotation. Я открыл билет в Spring, чтобы попросить пользовательский 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/issues/217