Spring Bootでjson文字列を受信してクラスに割り当てる
BeanとかFormとか呼ばれているもので画面とかの項目が設定されるやつ
前の時代などではパラメータを指定して取り込んでいたけどjsonで送った場合なども対応したクラスに割り当てたい場合等に対応
json形式で送った際きちんとクラスに設定されるか検証する
やること
受付用のクラスを作成
@RequestBodyアノテーションを使用
@RequestMappingで受け付けるデータを指定
受付用クラス
ItemForm.java
package com.example.form; import java.io.Serializable; public class ItemForm implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String name; private String date; private String price; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String toString(){ return "name = " + this.name + " date = " + this.date + " price = " + this.price; } }
ItemsForm.java
package com.example.form; import java.io.Serializable; import java.util.List; public class ItemsForm implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String count; private List<ItemForm> items; public String getCount() { return count; } public void setCount(String count) { this.count = count; } public List<ItemForm> getItems() { return items; } public void setItems(List<ItemForm> items) { this.items = items; } public String toString(){ String str = ""; str = "count = " + this.count + "\n"; str += ""; for(ItemForm item : this.items) { str += item.toString() + "\n"; } return str; } }
コントローラー設定
SampleController.java
package com.example.web; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.example.form.ItemForm; import com.example.form.ItemsForm; @RestController @RequestMapping("/sample") public class SampleController { @RequestMapping(value = "/test1", method = {RequestMethod.POST}, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public String item(@RequestBody ItemForm form){ return form.toString(); } @RequestMapping(value = "/test2", method = {RequestMethod.POST}, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public String items(@RequestBody ItemsForm form){ return form.toString(); } }
実行結果
・/sample/test1
$ curl -X POST \ > -H 'Content-Type:application/json' \ > -d '{ > "name": "hogehoge", > "date": "20151028", > "price": "12000" > }' http://localhost:8080/sample/test1 name = hogehoge date = 20151028 price = 12000
・/sample/test2
$ curl -X POST \ > -H 'Content-Type:application/json' \ > -d '{ > "count": "10", > "items": [ > { > "name": "foo1", > "date": "20160112", > "price": "1200" > }, > { > "name": "foo2", > "date": "20160212", > "price": "4300" > }, > { > "name": "foo3", > "date": "20160217", > "price": "2500" > }, > { > "name": "foo4", > "date": "20160519", > "price": "2000" > }, > { > "name": "foo5", > "date": "20160630", > "price": "1500" > } > ] > }' http://localhost:8080/sample/test2 count = 10 name = foo1 date = 20160112 price = 1200 name = foo2 date = 20160212 price = 4300 name = foo3 date = 20160217 price = 2500 name = foo4 date = 20160519 price = 2000 name = foo5 date = 20160630 price = 1500 $
クラスを階層構造を内部に持つことでネスト構造の場合も対応できる感じ
ファイルとかできるかはわからない
送り込むjsonのキーが存在しなくてもクラスの方はnullになるだけでエラーを起こすわけではない