Arbeiten mit Datumsparametern im Frühjahr

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, wie Sie die Parameter Date , LocalDate und LocalDateTime in Spring REST-Anforderungen sowohl auf Anforderungs- als auch auf Anwendungsebene akzeptieren .

2. Das Problem

Betrachten wir einen Controller mit drei Methoden, die die Parameter Date , LocalDate und LocalDateTime 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-Anforderung an eine dieser Methoden mit einem gemäß ISO 8601 formatierten Parameter senden, wird eine Ausnahme angezeigt.

Wenn Sie beispielsweise "2018-10-22" an den Endpunkt / date senden, 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 standardmäßig keine String-Parameter in ein Datums- oder Zeitobjekt konvertieren kann.

3. Konvertieren Sie Datumsparameter auf Anforderungsebene

Eine Möglichkeit, dieses Problem zu beheben, besteht darin, die Parameter mit der Annotation @DateTimeFormat zu kommentieren 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 Conversion-Muster verwenden. Wir können nur einen Musterparameter in der Annotation @DateTimeFormat angeben :

@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 durchzuführen, besteht darin, eine globale Konfiguration bereitzustellen. Wenn Sie der offiziellen Dokumentation folgen, sollten Sie die WebMvcConfigurationSupport- Konfiguration und die mvcConversionService- Methode erweitern:

@Configuration public class DateTimeConfig extends WebMvcConfigurationSupport { @Bean @Override public FormattingConversionService mvcConversionService() { DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false); DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar(); dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy")); dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")); dateTimeRegistrar.registerFormatters(conversionService); DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar(); dateRegistrar.setFormatter(new DateFormatter("dd.MM.yyyy")); dateRegistrar.registerFormatters(conversionService); return conversionService; } }

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

Als Nächstes müssen wir unsere benutzerdefinierten Formate für Datums- und Datums- / Uhrzeitparameter registrieren. Dazu müssen wir zwei Registrare für die benutzerdefinierte Formatierung registrieren. Das erste - DateTimeFormatterRegistar - ist für das Parsen der Objekte LocalDate und LocaDateTime verantwortlich . Der zweite - DateFormattingRegistrar - behandelt das Date- Objekt.

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 wir unsere eigenen Datumsformatierungsmuster erstellen.

Wie immer ist der gesamte Quellcode auf GitHub verfügbar.