完全に備忘録です。
SpringBootを使用する機会があり、GETで@ModelAttributeを使用してオブジェクトに自動でマッピングしていたのですが
複雑なオブジェクトにマッピングするにはクエリパラメータをどのように設定すればいいのかを少し調べたので残しておきます。
Controllerは共通してこんな感じ。
@GetMapping("/get_sample1") public void getSample1(@ModelAttribute QueryParam1 queryParam1) { System.out.println(queryParam1); }
1.普通
@ModelAttributeを付与するクラス
@Data public class QueryParam1 { private String paramString; private Integer paramInteger; private BigDecimal paramBigDecimal; private Boolean paramBoolean; }
URL
http://localhost:8080/get_sample1?paramString=test¶mInteger=123¶mBigDecimal=123.45¶mBoolean=true
出力(整形)
QueryParam1( paramString=test, paramInteger=123, paramBigDecimal=123.45, paramBoolean=true )
普通な感じ。
2.配列
@ModelAttributeを付与するクラス
@Data public class QueryParam2 { private String[] paramStringArray; }
URL
http://localhost:8080/get_sample2?paramStringArray%5B0%5D=test¶mStringArray%5B1%5D=hoge¶mStringArray%5B2%5D=fuga (デコード) paramStringArray[0]=test¶mStringArray[1]=hoge¶mStringArray[2]=fuga
出力(整形)
QueryParam2( paramStringArray=[ test, hoge, fuga ] )
普通に配列指定する感じで[]をつけるとマッピングしてくれる。
ちなみにカンマ区切りでも同様にマッピングしてくれる模様。
URL
http://localhost:8080/get_sample2?paramStringArray=test,hoge,fuga
3.オブジェクト
@ModelAttributeを付与するクラス
@Data public class QueryParam3 { private TestClass test; } @Data class TestClass { private String testString; private Integer testInteger; }
URL
http://localhost:8080/get_sample3?test.testString=aiueo&test.testInteger=123456789
出力(整形)
QueryParam3( test=TestClass( testString=aiueo, testInteger=123456789 ) )
4.オブジェクトの配列
@ModelAttributeを付与するクラス
@Data public class QueryParam4 { private TestClass2[] test; } @Data class TestClass2 { private String testString; private Integer testInteger; }
URL
http://localhost:8080/get_sample3?test.testString=aiueo&test.testInteger=123456789http://localhost:8080/get_sample4?test%5B0%5D.testString=aiueo&test%5B0%5D.testInteger=123456789&test%5B1%5D.testString=kakikukeko&test%5B1%5D.testInteger=987654321 (デコード) test[0].testString=aiueo&test[0].testInteger=123456789&test[1].testString=kakikukeko&test[1].testInteger=987654321
出力(整形)
QueryParam4( test=[ TestClass2( testString=aiueo, testInteger=123456789 ), TestClass2( testString=kakikukeko, testInteger=987654321 ) ] )
3と4の組み合わせ。
終わり
終わりです。