パラメータの受け取り その2

【前提条件】

[環境]
[JAX-RSの設定]
  • @ApplicationPath("/service")

【概要】

前回JAX-RSのパラメータの受け取りについて書きました。
その時はメソッドのパラメータとして受け渡していましたが、
今回はメンバ変数として受け取ります。

【サンプルコード(リソースクラス)】

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;

一つのメンバー変数に対して、
二つのアノテーションをつけるとうまく値が取得できません。