【问题标题】:case insensitive mapping for Spring MVC @RequestMapping annotations [duplicate]Spring MVC @RequestMapping注释的不区分大小写的映射[重复]
【发布时间】:2012-09-22 22:42:21
【问题描述】:

可能重复:
How can I have case insensitive URLS in Spring MVC with annotated mappings

我的控制器中有多个 @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 URL。

【问题讨论】:

  • 我会推荐你​​到stackoverflow.com/questions/4150039/…
  • @gtgaxiola 不,这与 RequestMapping 无关。这仅适用于 Controller 注释。这个我试过了。
  • 两个答案都是正确的,但方法不同。无论你选择什么。取决于你自己。
  • 我知道它是重复的,但这有清晰而详细的解释。我在那个重复的问题上找不到。这就是为什么我在这个问题上提供赏金。如果重复的问题是正确的,我为什么要这样做

标签: java web-applications spring-mvc


【解决方案1】:

以下简单的解决方案应该使@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,您可能需要删除 &lt;mvc:annotation-driven /&gt;(它会实例化一个 DefaultAnnotationHandlerMapping)。

【讨论】:

  • 你能看看我编辑的问题
  • @ZahidRiaz 你试过删除 吗?
  • 我试过了但是我得到了这个错误? javax.servlet.ServletException:处理程序没有适配器 [net.hrms.web.controller.SignUpController@6f70829e]:您的处理程序是否实现了支持的接口,例如 Controller?
  • @ZahidRiaz 当您删除 &lt;mvc:annotation-driven&gt; 时,您必须将其替换为它实例化的常用 bean。请参阅 this link (click here) :只需在 xml 中将 DefaultAnnotationHandlerMapping 替换为 CaseInsensitiveAnnotationHandlerMapping
  • 这可以解决问题。 +1 用于不同的解决方案。谢啦。你拯救了一天
【解决方案2】:

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注册这个路径匹配器,去掉&lt;mvc:annotation-driven/&gt;注解,替换成以下内容,适当配置:

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

【讨论】:

  • 你能看看我编辑的问题
  • 感谢您的宝贵时间。这真的很可观。
  • 这个解决方案也影响了查询参数,这对我们来说是个问题。有关 Spring 4.2 的更好解决方案,请参阅 this answer
猜你喜欢
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2019-10-04
  • 2017-07-19
  • 2019-07-01
  • 2018-08-31
相关资源
最近更新 更多