可能重复:
How can I have case insensitive URLS in Spring MVC with annotated mappings
我的Controller中有多个@RequestMapping注释。
@Controller
public class SignUpController {
@RequestMapping("signup")
public String showSignUp() throws Exception {
return "somejsp";
}
@RequestMapping("fullSignup")
public String showFullSignUp() throws Exception {
return "anotherjsp";
}
@RequestMapping("signup/createAccount")
public String createAccount() throws Exception {
return "anyjsp";
}
}
如何将这些@RequestMapping映射到不区分大小写。即如果我使用“/ fullsignup”或“/ fullSignup”,我应该得到“anotherjsp”。但现在这种情况并没有发生。只有“/ fullSignup”才能正常工作。
我尝试过扩展RequestMappingHandlerMapping但没有成功。我也尝试过AntPathMatcher,就像那个提到的那个人在这个论坛上有另一个问题,但它也不适用于@RequestMapping注释。
调试控制台
服务器启动时的输出控制台。
我添加了两张显示问题的图片。我已经尝试了下面提到的两种解决方案。控制台说它映射了小写的URL,但是当我请求访问带有小写url的方法时,它会显示存储值的原始映射包含MixCase URLS。
答案 0 :(得分:11)
How can I have case insensitive URLS in Spring MVC with annotated mappings中的一种方法完美无缺。我只是在控制器和请求方法的水平上使用@RequestMapping的组合尝试它并且它干净利落,我只是在这里为Spring 3.1.2复制它:
CaseInsensitivePathMatcher:
import java.util.Map;
import org.springframework.util.AntPathMatcher;
public class CaseInsensitivePathMatcher extends AntPathMatcher {
@Override
protected boolean doMatch(String pattern, String path, boolean fullMatch, Map<String, String> uriTemplateVariables) {
return super.doMatch(pattern.toLowerCase(), path.toLowerCase(), fullMatch, uriTemplateVariables);
}
}
使用Spring MVC注册此路径匹配器,删除<mvc:annotation-driven/>
注释,并替换为以下内容,进行适当配置:
<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>
<property name="validator">
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
</bean>
</property>
</bean>
</property>
<property name="messageConverters">
<list>
<ref bean="byteArrayConverter"/>
<ref bean="jaxbConverter"/>
<ref bean="jsonConverter"/>
<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>
</list>
</property>
</bean>
<bean name="byteArrayConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
<bean name="jaxbConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
<bean name="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean name="caseInsensitivePathMatcher" class="org.bk.lmt.web.spring.CaseInsensitivePathMatcher"/>
<bean name="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="pathMatcher" ref="caseInsensitivePathMatcher"></property>
</bean>
使用@Configuration更轻松,更干净:
@Configuration
@ComponentScan(basePackages="org.bk.webtestuuid")
public class WebConfiguration extends WebMvcConfigurationSupport{
@Bean
public PathMatcher pathMatcher(){
return new CaseInsensitivePathMatcher();
}
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setOrder(0);
handlerMapping.setInterceptors(getInterceptors());
handlerMapping.setPathMatcher(pathMatcher());
return handlerMapping;
}
}
答案 1 :(得分:4)
以下简单的解决方案应该使@RequestMapping不敏感,无论它是注释Controller还是方法。 Biju的解决方案也应该有效。
创建此自定义HandlerMapping:
public CaseInsensitiveAnnotationHandlerMapping extends DefaultAnnotationHandlerMapping {
@Override
protected Object lookupHandler(String urlPath, HttpServletRequest request)
throws Exception {
return super.lookupHandler(urlPath.toLowerCase(), request);
}
@Override
protected void registerHandler(String urlPath, Object handler)
throws BeansException, IllegalStateException {
super.registerHandler(urlPath.toLowerCase(), handler);
}
}
并在 [servlet-name] -servlet.xml中添加:
<bean class="yourpackage.CaseInsensitiveAnnotationHandlerMapping" />
注意:如果您不希望在应用中使用两个HandlerMapping,则可能需要删除<mvc:annotation-driven />
(它实例化DefaultAnnotationHandlerMapping
)。