Utilisation des paramètres de date au printemps

Utilisation des paramètres de date au printemps

1. introduction

Dans ce court didacticiel, nous allons voir comment accepter les paramètresDate,LocalDate etLocalDateTime dans les requêtes Spring REST, à la fois au niveau de la requête et de l'application.

2. Le problème

Considérons un contrôleur avec trois méthodes acceptant les paramètresDate,LocalDate etLocalDateTime:

@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 obtenons 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 date ou heure.

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

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 qu'elles 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 motif 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 date et heure dans Spring consiste à fournir une configuration globale. Nous pouvons le faire en suivantthe official documentation:

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

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

Et puis, nous enregistrons manuellement de nouveaux modèles pour les formats de date et d'heure dans l'objetDateTimeFormatterRegistrar.

5. Sommaire

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 à l'échelle mondiale.

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

Comme toujours, tout le code source est disponibleover on GitHub.