* 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>)