Spring uważa, że wszystko, co znajduje się za ostatnią kropką, to rozszerzenie pliku, takie jak .json
lub.xml
i skraca je, aby pobrać parametr.
Więc jeśli masz /{blahName}
:
/param
, /param.json
, /param.xml
Lub /param.anything
spowoduje param z wartościąparam
/param.value.json
, /param.value.xml
Lub /param.value.anything
spowoduje param z wartościąparam.value
Jeśli zmienisz mapowanie na /{blahName:.+}
zgodnie z sugestią, każda kropka, w tym ostatnia, będzie traktowana jako część parametru:
/param
da parametr o wartości param
/param.json
da parametr o wartości param.json
/param.xml
da parametr o wartości param.xml
/param.anything
da parametr o wartości param.anything
/param.value.json
da parametr o 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 znowu, jeśli masz /{blahName}
:
/param
, /param.json
, /param.xml
Lub /param.anything
spowoduje param z wartościąparam
/param.value.json
, /param.value.xml
Lub /param.value.anything
spowoduje param z wartościąparam.value
Uwaga: różnica w stosunku do domyślnej konfiguracji jest widoczna tylko wtedy, gdy masz mapowanie takie jak /something.{blahName}
. Zobacz problem z projektem Resthub .
Jeśli chcesz zachować zarządzanie rozszerzeniami, od Spring 3.2 możesz również ustawić właściwość useRegisteredSuffixPatternMatch komponentu bean RequestMappingHandlerMapping, aby funkcja rozpoznawania sufiksów była aktywna, ale ograniczona 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: annotation-based 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 nadpisać całą konfigurację mvc: opartą na adnotacjach. Otworzyłem zgłoszenie do Springa, aby poprosić o niestandardowe RequestMappingHandlerMapping: https://jira.springsource.org/browse/SPR-11253 . Prosimy o głosowanie, jeśli jesteś zainteresowany.
Podczas zastępowania należy uważać, aby rozważyć również zastąpienie niestandardowego zarządzania wykonaniem. W przeciwnym razie wszystkie niestandardowe mapowania wyjątków zakończą się niepowodzeniem. Będziesz musiał ponownie użyć wiadomości Coverters z fasolą listy:
<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>
Zaimplementowałem w otwartym projekcie Resthub , którego jestem częścią, zestaw testów na te tematy: patrz https://github.com/resthub/resthub-spring-stack/pull/219/files i https: // github.com/resthub/resthub-spring-stack/issues/217