私は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;
}
これでうまくいきました。最初に述べたような「間違った」リクエストがパターンに反映されていないことが内部的にわかります。
皆さん、ありがとうございました