アウトプットブログ

主にプログラミングで学んだことをアウトプットします。

【SpringBoot】GETで@ModelAttributeを使用する際のクエリパラメータの設定

完全に備忘録です。


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&paramInteger=123&paramBigDecimal=123.45&paramBoolean=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&paramStringArray%5B1%5D=hoge&paramStringArray%5B2%5D=fuga

(デコード)
paramStringArray[0]=test&paramStringArray[1]=hoge&paramStringArray[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
  )
)


javaっぽくドットでフィールド指定すればマッピングできる。

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の組み合わせ。

終わり

終わりです。