Java Spring MVC@RequestMapping注释的不区分大小写的映射

Java Spring MVC@RequestMapping注释的不区分大小写的映射,java,web-applications,spring-mvc,Java,Web Applications,Spring Mvc,可能重复: 我的控制器中有多个@RequestMapping注释 @Controller public class SignUpController { @RequestMapping("signup") public String showSignUp() throws Exception { return "somejsp"; } @RequestMapping("fullSignup") public String showFullSignUp() throws E

可能重复:

我的控制器中有多个@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映射到不区分大小写的。i、 e.如果我使用“/fullsignup”或“/fullsignup”,我应该得到“anotherjsp”。但现在这种情况并没有发生。只有“/fullSignup”工作正常

我尝试过扩展RequestMappingHandlerMapping,但没有成功。我也尝试过AntPathMatcher,就像前面提到的那个家伙一样,这个论坛上还有一个问题,但它对@RequestMapping注释也不起作用

调试控制台

服务器启动时的输出控制台


我已经添加了两张显示问题的图片。我已经尝试了下面提到的两种解决方案。控制台说它映射了小写url,但当我请求访问带有小写url的方法时,它显示存储值的原始映射仍然包含MixCase url

下面的简单解决方案应该使@RequestMapping不敏感,无论它是注释控制器还是方法。比丘的解决方案也应该奏效

创建此自定义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,您可能需要删除
(它实例化了一个
DefaultAnnotationHandlerMapping
)。

其中一种方法非常有效。我刚刚在控制器和请求方法级别尝试了@RequestMapping的组合,效果很好,我只是在这里为Spring 3.1.2复制它:

案例不敏感的路径匹配器:

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);
    }
}

我会让你参考@gtgaxiola不,这与RequestMapping无关。这仅适用于控制器注释。我试过了。两个答案都是正确的,但方法不同。无论你选择什么。这取决于你自己。我知道这是一个副本,但这有明确和详细的解释。我在那个重复的问题上找不到。这就是我在这个问题上悬赏的原因。如果重复的问题是正确的,我为什么要这样做?请看我编辑的问题谢谢你的时间。这个解决方案还影响了查询参数,这对我们来说是个问题。有关Spring 4.2的更好解决方案,请参见。您可以查看我的编辑版本吗question@ZahidRiaz你试过删除吗?我试过了,但我有这个错误?javax.servlet.ServletException:处理程序[net.hrms.web.controller]没有适配器。SignUpController@6f70829e]:您的处理程序是否实现了一个受支持的接口,如控制器?@ZahidRiaz当您删除
时,必须用它实例化的常用bean替换它。请参阅:只需将xml中的
DefaultAnnotationHandlerMapping
替换为
CaseInsensitiveAnnotationHandlerMapping
。这样就可以解决问题+1用于不同的解决方案。谢谢你,伙计。你拯救了这一天
<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
@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;
    }
}