1. ホーム
  2. spring

[解決済み] SpringでLocalDateTime RequestParamを使用するには?StringからLocalDateTimeへの変換に失敗しました」と表示される。

2022-11-07 02:03:21

質問

Spring Bootを使用していて jackson-datatype-jsr310 をMavenと一緒に使っています。

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.7.3</version>
</dependency>

Java 8 の Date/Time 型の RequestParam を使おうとすると。

@GetMapping("/test")
public Page<User> get(
    @RequestParam(value = "start", required = false)
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start) {
//...
}

で、このURLでテストしてください。

/test?start=2016-10-8T00:00

以下のようなエラーが出ます。

{
  "timestamp": 1477528408379,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
  "message": "Failed to convert value of type [java.lang.String] to required type [java.time.LocalDateTime]; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] for value '2016-10-8T00:00'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2016-10-8T00:00]",
  "path": "/test"
}

どのように解決するのですか?

TL;DR - で文字列としてキャプチャできます。 @RequestParam を使うか、Springに追加で文字列をパースさせてjavaの日付/時刻クラスにすることができます。 @DateTimeFormat を使うこともできます。

@RequestParam は = 記号の後に指定した日付を取得するのに十分ですが、 メソッドに来るのは String . それがキャスト例外を投げる理由です。

これを実現するには、いくつかの方法があります。

  1. 日付を自分で解析し、文字列として値を取得する。
@GetMapping("/test")
public Page<User> get(@RequestParam(value="start", required = false) String start){

    //Create a DateTimeFormatter with your required format:
    DateTimeFormatter dateTimeFormat = 
            new DateTimeFormatter(DateTimeFormatter.BASIC_ISO_DATE);

    //Next parse the date from the @RequestParam, specifying the TO type as 
a TemporalQuery:
   LocalDateTime date = dateTimeFormat.parse(start, LocalDateTime::from);

    //Do the rest of your code...
}

  1. 日付フォーマットを自動的にパースして期待するSpringの機能を活用する。
@GetMapping("/test")
public void processDateTime(@RequestParam("start") 
                            @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
                            LocalDateTime date) {
        // The rest of your code (Spring already parsed the date).
}