パラメータの受け取り その2
【サンプルコード(リソースクラス)】
package jp.glory.ui.service; import java.net.URI; import java.util.Map; import javax.ws.rs.CookieParam; import javax.ws.rs.FormParam; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.Cookie; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.UriInfo; @Path("param2") public class Parameter2Service { @FormParam("name") private String name = null; @FormParam("year") private String year = null; @CookieParam("JSESSIONID") private String sessionId = null; @HeaderParam("User-Agent") private String userAgent = null; @Context private UriInfo uriInfo = null; @Context private HttpHeaders header = null; @Context private Request request = null; @POST @Path("post") @Produces(MediaType.TEXT_PLAIN) public String getFormParam() { final String br = System.getProperty("line.separator"); final URI absolutePath = uriInfo.getAbsolutePath(); final Map<String, Cookie> cookies = header.getCookies(); final String method = request.getMethod(); final StringBuilder builder = new StringBuilder(); builder.append("Path : " + absolutePath + br); builder.append("Method : " + method + br); builder.append("User-Agent : " + userAgent + br); builder.append("JSESSIONID(Cookie) : " + sessionId + br); builder.append("JSESSIONID(Header Cookie) : " + cookies.get("JSESSIONID") + br); builder.append("Name : " + name + br); builder.append("Year : " + year + br); return builder.toString(); } }
FormParam、CookieParam、HeaderParam、Contextの
4つのアノテーションをメンバー変数につけています。
この状態で「../service/param2/post」にアクセスすると
getFormParamメソッドが呼ばれると同時に
各メンバー変数に値がインジェクションされます。
デフォルト値では
リクエストごとにリソースクラスのオブジェクトが
作成されるので同時実行も問題はありません。
JSR311仕様書(Maintenance Release)の
「3.1.1 Lifecycle and Environment」に記述されています。
JSR311仕様書
【実行するためのページ】
<html> <head> <title>JAX-RSサンプル</title> <style type="text/css"> .area { margin-bottom: 20px; } </style> </head> <body> <div class="area" > <form action="../service/param2/post" method="post"> <input type="text" name="name" value="" /><br/> <input type="text" name="year" value="" /><br/> <input type="submit" value="PostParam"/> </form> </div> </body> </html>
【メンバー変数化できるアノテーション】
サンプルコードではFormParamアノテーションを使っていましたが、
QueryParamアノテーション、MatrixParamアノテーションも
メンバー変数化できます。
PathParamアノテーションだけは
メソッドのパラメータとしてしか受け取れないようです。
【アノテーションの併用】
今回のサンプルで使用した
4つのアノテーションは併用して使用できました。
FormParamとQueryParamとMatrixParamの
三つのアノテーションは同時に使えない場合があります。
(使うことがあるのか怪しいですが・・・)
FormParamアノテーションは
HTTPメソッドがPostではないといけないので、
QueryParamとMatrixParamの2つのアノテーションとは併用できません。
QueryParamとMatrixParamの
2つアノテーションは併用できます。
【QueryParamとMatrixParamの併用】
[併用できる書き方]
@QueryParam("name") private String queryName = null; @MatrixParam("name") private String matrixName = null; @QueryParam("year") private String queryYear = null; @MatrixParam("year") private String matrixYear = null;
併用する場合、別々のメンバー変数にする必要があります。
[併用できない書き方]
@QueryParam("name") @MatrixParam("name") private String name = null; @QueryParam("year") @MatrixParam("year") private String year = null;
一つのメンバー変数に対して、
二つのアノテーションをつけるとうまく値が取得できません。