Mit Datumsparametern im Frühling arbeiten

Arbeiten mit Datumsparametern im Frühjahr

1. Einführung

In diesem kurzen Tutorial erfahren Sie, wie Sie die ParameterDate,LocalDate undLocalDateTime in Spring REST-Anforderungen sowohl auf Anforderungs- als auch auf Anwendungsebene akzeptieren.

2. Das Problem

Betrachten wir einen Controller mit drei Methoden, die die ParameterDate,LocalDate undLocalDateTime akzeptieren:

@RestController
public class DateTimeController {

    @PostMapping("/date")
    public void date(@RequestParam("date") Date date) {
        // ...
    }

    @PostMapping("/localdate")
    public void localDate(@RequestParam("localDate") LocalDate localDate) {
        // ...
    }

    @PostMapping("/localdatetime")
    public void dateTime(@RequestParam("localDateTime") LocalDateTime localDateTime) {
        // ...
    }
}

Wenn Sie eine POST-Anfrage an eine dieser Methoden mit einem gemäß ISO 8601 formatierten Parameter senden, erhalten wir eine Ausnahme.

Wenn Sie beispielsweise "2018-10-22" an den Endpunkt von/dateenden, wird ein fehlerhafter Anforderungsfehler mit einer ähnlichen Meldung angezeigt:

Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate';
  nested exception is org.springframework.core.convert.ConversionFailedException.

Dies liegt daran, dass Spring String-Parameter standardmäßig nicht in Datums- oder Uhrzeitobjekte konvertieren kann.

3. Datumsparameter auf Anforderungsebene konvertieren

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, die Parameter mit der Sannotation@DateTimeFormat zu versehen und einen Formatierungsmusterparameter bereitzustellen:

@RestController
public class DateTimeController {

    @PostMapping("/date")
    public void date(@RequestParam("date")
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date) {
        // ...
    }

    @PostMapping("/local-date")
    public void localDate(@RequestParam("localDate")
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {
        // ...
    }

    @PostMapping("/local-date-time")
    public void dateTime(@RequestParam("localDateTime")
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {
        // ...
    }
}

Auf diese Weise werden die Zeichenfolgen ordnungsgemäß in Datumsobjekte konvertiert, sofern die Zeichenfolgen im ISO 8601-Format formatiert sind.

Wir können auch unsere eigenen Konvertierungsmuster verwenden. Wir können nur einen Musterparameter in der Annotation von@DateTimeFormatangeben:

@PostMapping("/date")
public void date(@RequestParam("date")
  @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
    // ...
}

4. Konvertieren Sie Datumsparameter auf Anwendungsebene

Eine andere Möglichkeit, die Konvertierung von Datums- und Uhrzeitobjekten in Spring zu handhaben, besteht darin, eine globale Konfiguration bereitzustellen. Wir können dies tun, indem wirthe official documentation folgen:

@Configuration
class DateTimeConfig {

    @Bean
    public FormattingConversionService conversionService() {
        DefaultFormattingConversionService conversionService =
          new DefaultFormattingConversionService(false);

        DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
        registrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
        registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
        registrar.registerFormatters(conversionService);

        // other desired formatters

        return conversionService;
    }
}

Zuerst erstellen wirDefaultFormattingConversionService mit einem falschen Parameter, was bedeutet, dass Spring standardmäßig keine Formatierer registriert.

Anschließend registrieren wir manuell neue Muster für Datums- und Datums- / Uhrzeitformate im ObjektDateTimeFormatterRegistrar.

5. Zusammenfassung

In diesem Artikel haben wir gelernt, wie Sie die Datumsparameter in Spring MVC-Anforderungen akzeptieren. Wir haben erläutert, wie dies auf Anfrage und weltweit durchgeführt wird.

Wir haben auch gelernt, wie Sie unsere eigenen Datumsformatierungsmuster erstellen.

Wie immer ist der gesamte Quellcodeover on GitHub verfügbar.