Spring uważa, że cokolwiek za ostatnią kropką jest rozszerzeniem pliku, takim jak .json
lub.xml
i obciąć je, aby pobrać parametr.
Więc jeśli masz /somepath/{variable}
:
/somepath/param
, /somepath/param.json
, /somepath/param.xml
Lub /somepath/param.anything
spowoduje param z wartościąparam
/somepath/param.value.json
, /somepath/param.value.xml
lub /somepath/param.value.anything
spowoduje parametr o wartościparam.value
jeśli zmienisz mapowanie na /somepath/{variable:.+}
sugerowane, dowolna kropka, w tym ostatnia, będzie brana pod uwagę jako część parametru:
/somepath/param
spowoduje parametr z wartością param
/somepath/param.json
spowoduje parametr z wartością param.json
/somepath/param.xml
spowoduje parametr z wartością param.xml
/somepath/param.anything
spowoduje parametr z wartością param.anything
/somepath/param.value.json
spowoduje parametr z wartością param.value.json
- ...
Jeśli nie zależy Ci na rozpoznawaniu rozszerzeń, możesz je wyłączyć, zastępując 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>
Więc ponownie, jeśli masz /somepath/{variable}
:
/somepath/param
, /somepath/param.json
, /somepath/param.xml
Lub /somepath/param.anything
spowoduje param z wartościąparam
/somepath/param.value.json
, /somepath/param.value.xml
lub /somepath/param.value.anything
spowoduje parametr o wartościparam.value
Uwaga: różnica w stosunku do domyślnej konfiguracji jest widoczna tylko wtedy, gdy masz podobne mapowanie somepath/something.{variable}
. patrz problem z projektem Resthub
jeśli chcesz zachować zarządzanie rozszerzeniami, od wersji 3.2 możesz również ustawić właściwość useRegisteredSuffixPatternMatch komponentu Bean RequestMappingHandlerMapping, aby aktywować rozpoznawanie sufiksuPattern, ale ograniczone do zarejestrowanego rozszerzenia.
Tutaj definiujesz tylko rozszerzenia json i 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>
Zauważ, że mvc: oparty na adnotacjach akceptuje teraz opcję contentNegotiation w celu zapewnienia niestandardowego komponentu bean, ale właściwość RequestMappingHandlerMapping musi zostać zmieniona na true (domyślnie false) (por. Https://jira.springsource.org/browse/SPR-7632 ).
Z tego powodu nadal musisz przesłonić konfigurację opartą na wszystkich mvc: adnotacjach. Otworzyłem bilet do Spring z prośbą o niestandardowe RequestMappingHandlerMapping: https://jira.springsource.org/browse/SPR-11253 . Głosuj, jeśli jesteś zainteresowany.
Podczas nadpisywania pamiętaj o rozważeniu nadpisania niestandardowego zarządzania wykonywaniem. W przeciwnym razie wszystkie niestandardowe odwzorowania wyjątków zakończą się niepowodzeniem. Będziesz musiał ponownie użyć programu MessageCoverters z komponentem bean list:
<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>
Wdrożyłem, w projekcie Resthub projektu open source , którego jestem częścią, zestaw testów na te tematy: patrz https://github.com/resthub/resthub-spring-stack/pull/219/files & https: // github.com/resthub/resthub-spring-stack/issues/217