概要
Spring で OPTIONS メソッドのリクエストを受け取る方法を紹介します
普通に@RequestMapping
でmethod=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 件のコメント:
コメントを投稿