17

重複の可能性:
Spring MVC でアノテーション付きマッピングを使用して大文字と小文字を区別しない URL を使用するにはどうすればよいですか?

複数の @RequestMapping アノテーションを持つ Controller があります。

@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 を拡張しようとしましたが、成功しませんでした。このフォーラムには別の質問がありますが、@RequestMapping アノテーションでも機能しないと述べたように、AntPathMatcher も試しました。

デバッグ コンソール ここに画像の説明を入力

サーバーの起動時にコンソールを出力します。

ここに画像の説明を入力

問題を示す2つの画像を追加しました。以下の両方の解決策を試しました。コンソールには、小文字の URL がマップされていると表示されますが、小文字の URL を使用してメソッドへのアクセスを要求すると、値が保存されている元のマップに MixCase URL が含まれていることが示されます。

4

2 に答える 2

12

注釈付きマッピングを使用してSpringMVCで大文字と小文字を区別しないURLを作成する方法のアプローチの1つは、完全に機能します。コントローラとリクエストメソッドのレベルで@RequestMappingを組み合わせて試してみましたが、問題なく動作しました。ここでは、Spring3.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);
    }
}

このパスマッチャーをSpringMVCに登録し、<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;
    }
}
于 2012-10-04T19:44:00.387 に答える
4

次の簡単な解決策は、 @RequestMapping が Controller にアノテーションを付けるかメソッドにアノテーションを付けるかに関係なく、 @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-name] -servlet.xmlに追加します 。

<bean class="yourpackage.CaseInsensitiveAnnotationHandlerMapping" />

注: アプリに 2 つの HandlerMapping が必要ない場合は、削除することをお勧めします<mvc:annotation-driven />(インスタンス化されますDefaultAnnotationHandlerMapping)。

于 2012-10-04T17:28:51.410 に答える