spring及びspring-mvcのバージョン3.1.0を使用した
tomcat6系にデプロイしたアプリで発生したのですが
spring-mvcってHTTPのOPTIONSメソッドを
上手くハンドリングできないような。。。

spring-mvcのバージョン3系では
@Controllerアノテーションを付けたクラスに
@RequestMappingアノテーションを付けて
リクエストとURLのマッピングを行います

@RequestMappingにはマッピングするURLの文字列だけでなく
ハンドリング対象のHTTPメソッドも指定できます。

@RequestMapping(value="/hoge",
        method=RequestMethod.GET)
public String execGet() {
    return "getDisplay"
}
@RequestMapping(value="/hoge",
        method=RequestMethod.POST)
public String execPost() {
    return "postDisplay"
}

@RequestMappingはクラスまたはメソッド単位で指定できるので
上記のように指定すると
同じ/hogeというURLに対してアクセスがあっても
GETメソッドの場合はexecGetが呼ばれ
POSTメソッドの場合はexecPostが呼ばれます。

今回発生した現象は
@RequestMappingアノテーションに
method=RequestMethod.OPTIONSを指定しても
指定の処理が呼ばれないというものでした。

URLのマッピングはそのままで
methodの設定をGETとかPOSTに変えて
該当メソッドでアクセスすると
意図した通りの処理が呼ばれていたので
URLのマッピングは問題ないようなのですが
method=RequestMethod.OPTIONSに変えて
OPTIONSメソッドで同じURLにアクセスしても
処理が何も呼ばれなくなってしまいました。。。

仕方ないので今回は
該当URLに対してFilterを作成し
該当URLへのアクセス毎にHTTPメソッドをチェックし
HTTP OPTIONSでアクセスがあった場合は
Filterからレスポンスを返すようにしました。

public void doFilter(
  ServletRequest request,
  ServletResponse response,
  FilterChain chain)
throws IOException, ServletException {

  HttpServletRequest req = (HttpServletRequest)request;

  if ("options".equalsIgnoreCase(req.getMethod())) {
    
   HttpServletResponse res = (HttpServletResponse)response;
   // レスポンスの設定と画面遷移
  } else {
   chain.doFilter(request, response);
  }
}

一応、これで意図した通りの処理が実行されましたが
何か微妙な感じですねー

今回の要件ではOPTIONSメソッドでアクセスがあった場合は
特定のレスポンスヘッダを設定するだけでよかったのですが
何か業務ロジックの呼び出しとか必要な処理だと嫌な感じですね

この現象ってspring-mvcのバグなのか
あるいは単純にこちらの設定ミスなのか