Utilisation des paramètres de date au printemps

1. Introduction

Dans ce court didacticiel, nous verrons comment accepter les paramètres Date , LocalDate et LocalDateTime dans les demandes Spring REST, à la fois au niveau de la demande et de l'application.

2. Le problème

Considérons un contrôleur avec trois méthodes qui acceptent les paramètres Date , LocalDate et LocalDateTime :

@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) { // ... } }

Lors de l'envoi d'une requête POST à ​​l'une de ces méthodes avec un paramètre formaté conformément à la norme ISO 8601, nous obtiendrons une exception.

Par exemple, lors de l'envoi de «2018-10-22» au point de terminaison / date, nous obtiendrons une erreur de demande incorrecte avec un message similaire à celui-ci:

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

En effet, Spring par défaut ne peut pas convertir les paramètres String en un objet de date ou d'heure.

3. Convertir les paramètres de date au niveau de la demande

L'une des façons de gérer ce problème consiste à annoter les paramètres avec l' annotation @DateTimeFormat et à fournir un paramètre de modèle de mise en forme:

@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) { // ... } }

De cette façon, les chaînes seront correctement converties en objets de date, à condition que les chaînes soient formatées au format ISO 8601.

Nous pouvons également utiliser nos propres modèles de conversion. Nous pouvons simplement fournir un paramètre de modèle dans l' annotation @DateTimeFormat :

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

4. Convertir les paramètres de date au niveau de l'application

Une autre façon de gérer la conversion d'objet de date et d'heure dans Spring est de fournir une configuration globale. En suivant la documentation officielle, nous devrions étendre la configuration WebMvcConfigurationSupport et étendre sa méthode mvcConversionService :

@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; } }

Tout d'abord, nous créons DefaultFormattingConversionService avec un paramètre false, ce qui signifie que Spring n'enregistrera aucun formateur par défaut.

Ensuite, nous devons enregistrer nos formats personnalisés pour les paramètres de date et d'heure. Nous devons le faire en enregistrant deux bureaux d'enregistrement de formatage personnalisés. Le premier - DateTimeFormatterRegistar sera responsable de l'analyse des objets LocalDate et LocaDateTime . Le second - DateFormattingRegistrar gérera l' objet Date .

5. Résumé

Dans cet article, nous avons appris à accepter les paramètres de date dans les requêtes Spring MVC. Nous avons expliqué comment le faire par demande et dans le monde entier.

Nous avons également appris à créer nos propres modèles de formatage de date.

Comme toujours, tout le code source est disponible sur GitHub.