JAX-RSでの入力値の受取と返却

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

URLとサービスの紐付け方法

Class および メソッドに付与した @Path アノテーション、および @GET、@POST、@PUT、@DELETE アノテーションにより決定される。

// ↓ このアノテーションは /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!";
	}
} 


値の受取方法

受信するデータ形式の指定方法

メソッドに @Consumes アノテーションを付与する事により受信データの形式を指定します。

	// この例では 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() {
		・
		・
	} 

URLの一部を値として受け取る

メソッド引数に @PathParam を付与する事により、URLの一部からリクエストデータを取得する事ができます。

@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) {
		・
		・
	} 
} 

FORMへの入力値を個別に受け取る

メソッド引数に @FormParam を付与する事により、POSTされたFORMデータを取得する事ができます。

	@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) {
		・
		・
	} 

FORMへの入力値をBeanで受け取る

メソッド引数に @BeanParam を付与する事により、POST、PUTされたデータをBean、Dto で一括で受け取る事ができます。

@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 が必要です。

public class BookDto {
	・
	・
	@FormParam("isbn")
	private String isbn;

	@FormParam("title")
	private String title;

	@FormParam("price")
	private int price;
	・
	・
} 

FORMへの入力値をMapで受け取る

引数の型を MultivaluedMap にすると入力データをMapで受け取る事ができる

	@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 はキーに対して複数の値を持つ為)
		}
		・
		・
	} 

値の返却方法

返却するデータ形式の指定方法

メソッドに @Produces アノテーションを付与する事により返却値の形式を指定します。

	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Map<String,Object> test1() {
		・
		・
	} 

値の返却例

実際にメソッドから返却するデータ型は自由に選ぶ事ができます。
メソッドの戻り値が @Produces で指定した形式に変換されて返却されます。

	// この例では 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\" }";
	} 

XMLを返却する場合に、DTO に付与するアノテーション

XMLを返却する場合は、Dtoクラスに @XmlRootElement アノテーションを付与する必要があります

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

// name を省略した場合は DTOクラス名(<BookDto>)がルート要素名となります。
@XmlRootElement
public class BookDto {
	・
	・
} 

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-08-12 (水) 19:04:07 (3443d)