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

spring initializrの設定

クエリ文字列で取得

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のようなフォーマットでマッピングすることはできませんでした。

ソースコード

https://github.com/ale51/spring-boot-date-demo/blob/master/src/main/java/com/example/datedemo/LocalDateTimeController.java