* JAX-RSでの入力値の受取と返却 [#z4bdeafc]
#setlinebreak(on)

以下、JAX-RS でサービスを作成する場合の、値の受け取り、および 返却方法について記載する。

#contents
-- 関連
--- [[JAX-RSの環境構築]]
--- [[JAX-RSによる簡単なWebサービス作成]]

** URLとサービスの紐付け方法 [#r426f512]
#html(<div style="padding-left:20px;">)
Class および メソッドに付与した @Path アノテーション、および @GET、@POST、@PUT、@DELETE アノテーションにより決定される。

#mycode(){{
// ↓ このアノテーションは /books へのリクエストをこのクラスが処理する事を示しています
@Path("books")
public class BooksResource {

	@GET
	public String test(){

		// このメソッドは  /books へのGETリクエスト時に実行される

		return "test!";
	}

	@POST
	public String post(){

		// このメソッドは  /books へのPOSTリクエスト時に実行される

		return "test!";
	}

	@PUT
	public String put(){

		// このメソッドは  /books へのPUTリクエスト時に実行される

		return "test!";
	}

	@DELETE
	public String delete(){

		// このメソッドは  /books へのDELETEリクエスト時に実行される

		return "test!";
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 以下のように メソッドに @Path アノテーションを付与する事により、さらに 細かく制御する事が可能です。
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	@GET
	@Path("{id}")
	public String test(){

		// このメソッドは  /books/1 等へのGETリクエスト時に実行される

		return "test!";
	}

	@POST
	@Path("test")
	public String test(){

		// このメソッドは  /books/test へのPOSTリクエスト時に実行される

		return "test!";
	}
} 
}}
#html(</div>)

&br;

** 値の受取方法 [#p65c7f37]
#html(<div style="padding-left:20px;">)

*** 受信するデータ形式の指定方法 [#mb83c327]
#html(<div style="padding-left:20px;">)
メソッドに @Consumes アノテーションを付与する事により受信データの形式を指定します。
#mycode(){{
	// この例では JSONデータを受け取ります
	@GET
	@Consumes(MediaType.APPLICATION_JSON)
	public Map<String,Object> test1() {
		・
		・
	} 

	// 以下のように複数のデータ形式を受け付ける事も可能です
	@GET
	@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML })
	public Map<String,Object> test1() {
		・
		・
	} 
}}
#html(</div>)
*** URLの一部を値として受け取る [#g53d8584]
#html(<div style="padding-left:20px;">)
メソッド引数に @PathParam を付与する事により、URLの一部からリクエストデータを取得する事ができます。
#mycode(){{
@Path("books")
public class BooksResource {

	// 以下の例では books/123 へのリクエスト時に、id=123 を受け取る事ができます。
	@GET
	@Path("{id}")
	@Produces(MediaType.APPLICATION_XML)
	public BookDto show1(@PathParam("id") Integer id) {
		・
		・
	} 

	// 以下の例では books/test/123/abc へのリクエスト時に、id=123、no="abc" を受け取る事ができます。
	@GET
	@Path("test/{id}/{no}")
	@Produces(MediaType.APPLICATION_XML)
	public BookDto show2(@PathParam("id") Integer id, @PathParam("no") String no) {
		・
		・
	} 
} 
}}
#html(</div>)

*** FORMへの入力値を個別に受け取る [#c8d750ff]
#html(<div style="padding-left:20px;">)
メソッド引数に @FormParam を付与する事により、POSTされたFORMデータを取得する事ができます。
#mycode(){{

	@POST
	@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML })
	@Produces(MediaType.APPLICATION_JSON)
	public String create(@FormParam("isbn") String isbn, @FormParam("title") String title, @FormParam("price") String price) {
		・
		・
	} 
}}
#html(</div>)

*** FORMへの入力値をBeanで受け取る [#a02eb69c]
#html(<div style="padding-left:20px;">)
メソッド引数に @BeanParam を付与する事により、POST、PUTされたデータをBean、Dto で一括で受け取る事ができます。
#mycode(){{
@Path("books")
public class BooksResource {

	@POST
	@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML })
	@Produces(MediaType.APPLICATION_JSON)
	public String create(@BeanParam BookDto book) {
		・
		・
	} 
} 
}}

Dto の項目には @FormParam が必要です。
#mycode(){{
public class BookDto {
	・
	・
	@FormParam("isbn")
	private String isbn;

	@FormParam("title")
	private String title;

	@FormParam("price")
	private int price;
	・
	・
} 
}}
#html(</div>)

*** FORMへの入力値をMapで受け取る [#a2da59f4]
#html(<div style="padding-left:20px;">)
引数の型を MultivaluedMap にすると入力データをMapで受け取る事ができる
#mycode(){{
	@PUT
	@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML })
	@Produces(MediaType.APPLICATION_JSON)
	public Map<String,Object> update(MultivaluedMap<String, String> params) {
		Iterator<Map.Entry<String,List<String>>> it = params.entrySet().iterator();
		while (it.hasNext()) {
			Entry<String,List<String>> entry = it.next();
			String key = entry.getKey();
			List<String> vals = entry.getValue();
			System.out.println(key + "=" + vals.get(0)); // ここでは値リストの1件目だけを表示(MultivaluedMap はキーに対して複数の値を持つ為)
		}
		・
		・
	} 
}}
#html(</div>)


#html(</div>)

** 値の返却方法 [#n13cde11]
#html(<div style="padding-left:20px;">)

*** 返却するデータ形式の指定方法 [#mb83c327]
#html(<div style="padding-left:20px;">)
メソッドに @Produces アノテーションを付与する事により返却値の形式を指定します。
#mycode(){{
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Map<String,Object> test1() {
		・
		・
	} 
}}
#html(</div>)

*** 値の返却例 [#e7dc53bd]
#html(<div style="padding-left:20px;">)
実際にメソッドから返却するデータ型は自由に選ぶ事ができます。
メソッドの戻り値が @Produces で指定した形式に変換されて返却されます。
#mycode(){{

	// この例では Map が JSON に変換されて返却されます。
	@GET
	@Path("test1")
	@Produces(MediaType.APPLICATION_JSON)
	public Map<String,Object> test1() {
		Map<String,Object> book = new HashMap<String,Object>();
		book.put("id", 1);
		book.put("isbn", "ISBN1"); 
		book.put("title", "タイトル1");
		book.put("price", 1001);
		return book;
	} 

	// この例では BookDto が XML に変換されて返却されます。
	// ただし、Dtoクラスに @XmlRootElement アノテーションが必要です。(後述を参照)
	@GET
	@Path("test2")
	@Produces(MediaType.APPLICATION_XML)
	public BookDto test2() {
		BookDto book = new BookDto();
		book.setId(1);
		book.setIsbn("ISBN1"); 
		book.setTitle("タイトル1");
		book.setPrice(1001);
		return book;
	} 

	// 自分で JSONやXML文字列を組み立てて返却する事も可能です
	@GET
	@Path("test3")
	@Produces(MediaType.APPLICATION_JSON)
	public String test3() {
		return "{ \"method\" : \"test3\" }";
	} 
}}
#html(</div>)

*** XMLを返却する場合に、DTO に付与するアノテーション [#z924b3bd]
#html(<div style="padding-left:20px;">)
XMLを返却する場合は、Dtoクラスに @XmlRootElement アノテーションを付与する必要があります
#mycode(){{

// この場合、XMLルート要素はDTOクラス名(<BookDto>)となります。
@XmlRootElement
// この場合、XMLルート要素は <book> となります。
@XmlRootElement(name="book")
public class BookDto {
	・
	・
} 

// この場合、XMLルート要素は <book>となります。
@XmlRootElement(name="book")
// name を省略した場合は DTOクラス名(<BookDto>)がルート要素名となります。
@XmlRootElement
public class BookDto {
	・
	・
} 
}}
#html(</div>)

#html(</div>)

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS