Подтвердить что ты не робот

Нечувствительное к регистру для Spring MVC @RequestMapping аннотации

Возможный дубликат:
Как я могу иметь нечувствительные к регистру URL-адреса в Spring MVC с аннотированными сопоставлениями

У меня есть контроллер с несколькими аннотациями @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.

Отладочная консоль enter image description here

Выходная консоль при завершении работы сервера.

enter image description here

Я добавил два изображения, которые показывают проблему. Я пробовал оба решения, упомянутые ниже. Консоль говорит, что она сопоставила нижестоящие URL-адреса, но когда я запрашиваю доступ к методу с строчным URL-адресом, тогда он показывает, что исходная карта, где хранятся значения, содержит URL-адреса MixCase.

4b9b3361

Ответ 1

Один из подходов в Как я могу иметь нечувствительные к регистру URL-адреса в Spring MVC с аннотированными сопоставлениями работает отлично. Я просто попробовал это с комбинациями @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;
    }
}

Ответ 2

Следующее простое решение должно сделать @RequestMapping нечувствительным, аннотирует ли он контроллер или метод. Решение 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.xml:

<bean class="yourpackage.CaseInsensitiveAnnotationHandlerMapping" />

Примечание. Если вы не хотите использовать два HandlerMapping в своем приложении, вы можете удалить <mvc:annotation-driven /> (он создает экземпляр DefaultAnnotationHandlerMapping).