Spring Bootで日時パラメータのリクエストをLocalDateTimeとして取得する方法
Spring Bootで、日時パラメータのデータのリクエストをLocalDateTimeとして取得する方法を提示します。その方法について、クエリ文字列からの取得方法とJSON形式のリクエストボディからの取得方法の大きく2つを説明します。
Keywords
- Spring Boot
Contents
- 1. 前提
- 2. クエリ文字列で取得
- 2-1. RequestParamを使う方法
- 2-2. ModelAttributeを使って、複数のパラメータを一つのオブジェクトにマッピングする方法
- 3. リクエストボディでの取得
- 4. ソースコード
前提
Spring Bootのバージョン: 2.3.0
クエリ文字列で取得
RequestParamを使う方法
2019-07-13T18:32:00のようなISOフォーマットに則している場合、
http://localhost:8080/localdatetime?datetime=2019-07-13T18:32:00
このようなコードでLocalDateTimeの変数にマッピングできます。
@GetMapping
public void get(@RequestParam(name = "datetime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime){
System.out.println(localDateTime);
}
2019/07/13 18:32:00のようなフォーマットの場合、
http://localhost:8080/localdatetime/format?datetime=2019/07/13 18:32:00
このようなコードでLocalDateTimeの変数にマッピングできます。
@GetMapping("format")
public void get2(@RequestParam(name = "datetime") @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") LocalDateTime localDateTime){
System.out.println(localDateTime);
}
ModelAttributeを使って、複数のパラメータを一つのオブジェクトにマッピングする方法
下記のように、クエリ文字列が複数ある場合でも、ModelAttributeを使用すれば、一つのオブジェクトにマッピングできます。
http://localhost:8080/localdatetime/multi?startAt=2019-07-13T18:32:00&endAt=2020-07-13T18:32:00
その際、マッピングする先のオブジェクトを定義する必要があります。
@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_TIME)
private LocalDateTime startAt;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime endAt;
}
フォーマットがyyyy/MM/dd HH:mm:ssの場合は、下記の通りです。
@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 HH:mm:ss")
private LocalDateTime startAt;
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")
private LocalDateTime endAt;
}
リクエストボディでの取得
ここでは、JSON形式のPOSTリクエストの例を示しています。
curl -X POST \
http://localhost:8080/localdatetime \
-H 'Content-Type: application/json' \
-d '{
"startAt": "2019-07-13T18:32:00",
"endAt": "2020-07-13T18:32:00"
}'
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_TIME)
private LocalDateTime startAt;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime endAt;
}
また、この場合ですと、yyyy/MM/ddのようなフォーマットでマッピングすることはできませんでした。