2015年7月23日木曜日

Spring の @RequestMapping で OPTIONS メソッドを処理する方法

概要

Spring で OPTIONS メソッドのリクエストを受け取る方法を紹介します
普通に@RequestMappingmethod=RequestMethod.OPTIONSを指定するだけだとダメでした

環境

  • Mac OS X 10.10.3
  • Eclipse Luna 4.4.1
  • Spring Framework 4.1.6
  • Spring Tool Suite 3.6.4
  • Java 1.8.0_31
  • Maven 3.2.1

サンプルプロジェクト作成

過去の記事を参考に作成してください
Spring Framework のバージョンが最新でない場合は pom.xml 「org.springframework-version」のバージョン記載部分を最新のバージョンに変更してください

コーディング

@RequestMappingにOPTIONSメソッドを追加する

これだけだとダメという話をしましたが、これがないと始まらないので定義します

@RequestMapping(value = "/", method = {RequestMethod.GET, RequestMethod.OPTIONS})

既存のメソッドと同じマッピングで受け取る場合は中括弧を使って定義してください
もちろん上記を追加しただけだと、まだリクエストを受け取ることができません

web.xml に定義を追加する

web.xml<servlet>タグに以下を追記します

<servlet>
  <servlet-name>appServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>dispatchOptionsRequest</param-name>
    <param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

おそらくweb.xml内に<servlet>タグはすでにあると思います
<servlet-name><servlet-class>がある場合は新規で追加しなくてOKなので過不足分を既存の<servlet>タグ内に追記すればOKです

web.xmlはSTSで作成していれば、src/main/webapp/WEB-INF/web.xmlにあります

動作確認

書き換えが完了したらアプリを再起動してOPTIONSメソッドのリクエストが処理されるか確認してみましょう
自分はいつもcurlコマンドで確認しますが、curl の場合は以下のようにするとOPTIONSメソッドのリクエストが送信できます

curl -v -X OPTIONS http://localhost:8080/test/

これで@RequestMappingアノテーションが付与されたメソッドが実行されればOKです

Tips

MockMVCを使っている場合に有効にする方法

上記の手順を実行すれば実際のアプリ側でOPTIONSメソッドのリクエストを取得することができます
ただ、テストの場合は有効になっていないようで別途有効にする必要があります
MockMVCを使っているのであればテスト用のMockMVCのオブジェクトを生成する際に.dispatchOptions(true)を指定します

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).dispatchOptions(true).build();

これを実施しないとテスト時にOPTIONSメソッドが受け取れませんでした

最後に

OPTIONSメソッドはリソースがサポートしているメソッドの一覧を返却するために用意されたメソッドです
OPTIONSメソッドのリクエストのときにレスポンスボディを返却することは基本ないと思いますが、やりたい場合は今回紹介した方法で実現できると思います

0 件のコメント:

コメントを投稿