Spring Bootで日付パラメータのリクエストをLocalDateとして取得する方法
Spring Bootで、日付パラメータのデータのリクエストをLocalDateとして取得する方法を提示します。その方法について、クエリ文字列からの取得方法とJSON形式のリクエストボディからの取得方法の大きく2つを説明します。
Keywords
- Spring Boot
Contents
- 1. 前提
- 2. クエリ文字列で取得
- 2-1. RequestParamを使う方法
- 2-2. ModelAttributeを使って、複数のパラメータを一つのオブジェクトにマッピングする方法
- 3. リクエストボディでの取得
- 4. ソースコード
前提
Spring Bootのバージョン: 2.3.0
クエリ文字列で取得
RequestParamを使う方法
2019-07-13のようなISOフォーマットに則している場合、
http://localhost:8080/localdate?date=2019-07-13
このようなコードでLocalDateの変数にマッピングできます。
@GetMapping
public void get(@RequestParam(name = "date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate){
System.out.println(localDate);
}
2019/07/13のようなフォーマットの場合、
http://localhost:8080/localdate/format?date=2019/07/13
このようなコードでLocalDateの変数にマッピングできます。
@GetMapping("format")
public void get2(@RequestParam(name = "date") @DateTimeFormat(pattern = "yyyy/MM/dd") LocalDate localDate){
System.out.println(localDate);
}
ModelAttributeを使って、複数のパラメータを一つのオブジェクトにマッピングする方法
下記のように、クエリ文字列が複数ある場合でも、ModelAttributeを使用すれば、一つのオブジェクトにマッピングできます。
http://localhost:8080/localdate/multi?startAt=2019-07-13&endAt=2019-08-13
その際、マッピングする先のオブジェクトを定義する必要があります。
@GetMapping("multi")
public void get3(
@ModelAttribute MultiForm multiForm
){
System.out.println(multiForm.getStartAt());
System.out.println(multiForm.getEndAt());
}
@Data
static class MultiForm {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate startAt;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate endAt;
}
フォーマットがyyyy/MM/ddの場合は、下記の通りです。
@GetMapping("multi/format")
public void get4(
@ModelAttribute MultiFormatForm multiFormatForm
){
System.out.println(multiFormatForm.getStartAt());
System.out.println(multiFormatForm.getEndAt());
}
@Data
static class MultiFormatForm {
@DateTimeFormat(pattern = "yyyy/MM/dd")
private LocalDate startAt;
@DateTimeFormat(pattern = "yyyy/MM/dd")
private LocalDate endAt;
}
リクエストボディでの取得
ここでは、JSON形式のPOSTリクエストの例を示しています。
curl -X POST \
http://localhost:8080/localdate \
-H 'Content-Type: application/json' \
-d '{
"startAt": "2019-07-13",
"endAt": "2019-08-13"
}'
ModelAttributeの箇所で説明したように、この場合でもマッピング先のクラスを定義しておく必要があります。
@PostMapping
public void post(
@RequestBody MultiForm multiForm
){
System.out.println(multiForm.getStartAt());
System.out.println(multiForm.getEndAt());
}
@Data
static class MultiForm {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate startAt;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate endAt;
}
また、この場合ですと、yyyy/MM/ddのようなフォーマットでマッピングすることはできませんでした。