m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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になるだけでエラーを起こすわけではない

所感

フレームワークも新しくなることでいままで手動でゴリゴリやっていた部分が結構簡単に対応できるようになった感じ、
ただ、会社では簡単に新しいフレームワークを試せないのでちょっともったいない気がする。
とりあえず、新しい技術に取り残されないように勉強はしておかないと…