3

私はURLマッピングに問題があり、誰かが私を助けてくれるかもしれないと思っていました:-)

私のSpringMVCアプリケーションには、dispatcherServlerのマッピングが次のようにあります。

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

次に、次のように注釈が付けられたメソッドを持つコントローラーサーブレットがあります。

MyServlet {
....myMethod    
@RequestMapping(value = "/qwert/request", method = RequestMethod.POST)

結論として、マッピングを備えたDelegatingFilterProxyがあります。

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/qwert/request</url-pattern>
</filter-mapping>

そのターゲットは、前述のMyServletのメソッドに向けられたすべてのリクエストをインターセプトすることです。

アプリケーションは、通常のリクエストlocalhost:port / MyApp / qwert / requestに対して正常に機能しています。これは、フィルターがリクエストをインターセプトしてビジネスを行っていることを意味します。

問題は、このlocalhost:port / MyApp / qwert / request.doのようなリクエストが、フィルターを通過せずにサーブレット(MyServlet)メソッドに直接入ることです。@RequestMappingが/qwert/request.doではありませんが、リクエストがサーブレットに到着するのはどうしてですか?

私のdispatcherServletマッピングを*.doのようなものに変更したり、それに応じて他の変更を加えたりせずに、これを解決する方法を誰かが知っていますか?

アプリケーションがlocalhost:port / MyApp / qwert / request.whateverではなくlocalhost:port / MyApp / qwert / requestでリクエストを処理するようにしたいのですが、フィルターマッピングを/ *に変更できません。これは、必要のない他のメソッドがあるためです。フィルタの介入。

ありがとう

アップデート1:

はい、/ qwert / request。*のようなフィルターのURLパターンを導入しようとしましたが、その場合、フィルターはリクエストをインターセプトしません。localhost:port / MyApp / qwert / requestでもlocalhost:port / MyApp / qwert / request.whateverでもありません(通常の呼び出し元が最初に使用する必要があります)

解決

最後に私は問題が何であるかを見つけました、@Jhonathanは私を正しい方向に向けました

DefaultAnnotationHandlerMappingの代わりにRequestMappingHandlerMappingを定義する必要がありました

@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
    RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();      
    // no dot like names will be matched
    mapping.setUseSuffixPatternMatch(false);
    // no trailing slash will be matched
    mapping.setUseTrailingSlashMatch(false);
    return mapping;
}

これでうまくいきました。最初に述べたような「間違った」リクエストがパターンに反映されていないことが内部的にわかります。

皆さん、ありがとうございました

4

1 に答える 1

1

最初の質問

私の @RequestMapping は /qwert/request.do ではありません。どのようにしてリクエストがサーブレットに到着するのでしょうか?

春はデフォルトでかかります

/qwert/request.do 
/qwert/request.whatever
/qwert/request.*

お気に入り

/qwert/request 

したがって、あなたの@RequestMapping(value = "/qwert/request", method = RequestMethod.POST)テイクリクエスト。このデフォルト オプションを変更するには、DefaultAnnotationHandlerMapping を変更します。

 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
     <property name="useDefaultSuffixPattern" value="false" />
 </bean>

春の源から:

setUseDefaultSuffixPattern

public void setUseDefaultSuffixPattern(boolean useDefaultSuffixPattern)

デフォルトの接尾辞パターンも使用してパスを登録するかどうかを設定します。つまり、「/users」を「/users.」および「/users/」としても登録するかどうかを設定します。デフォルトは「真」です。@RequestMapping パスを厳密に解釈する場合は、この規則をオフにします。「.xxx」サフィックスを含むパスまたは「/」で終わるパスは、いずれの場合でも、デフォルトのサフィックス パターンを使用して変換されないことに注意してください。

于 2012-10-03T13:32:48.627 に答える