Spring MVC GET request avec le paramètre Java 8 Instant request


J'essaie d'écrire un contrôleur Spring MVC GET qui prend un paramètre Java 8 Instant as request:

    @GetMapping
    @JsonView(OrderListing.class)
    @Validated
    public WebSeekPaginatedResultsDto<OrderListingDto> findAll(@Valid OrderSearchCommand orderSearchCommand) {
       // Some code
    }

Avec:

    public class OrderSearchCommand {
        private Instant dateCreatedStart;
        private Instant dateCreatedEnd;
        // Some other fields
    }

Je déclenche une demande GET à partir d'un code React/Javascript avec quelque chose comme ça:

    http://localhost:8080/mms/front/orders?dateCreatedStart=2017-05-31T22%3A00%3A00.000Z 

Spring ne semble pas l'aimer et lance une erreur. Voici le message d'erreur:

    Failed to convert property value of type 'java.lang.String' to required type 'java.time.Instant' for property 'dateCreatedStart'; 
    nested exception is java.lang.IllegalStateException: 
    Cannot convert value of type 'java.lang.String' to required type 'java.time.Instant' for property 'dateCreatedStart': no matching editors or conversion strategy found

Une idée de pourquoi je reçois cela?

Merci

Author: Ole V.V., 2017-06-30

3 answers

Le message d'erreur est explicite: il n'y a pas de convertisseur String en Instant enregistré.

Lorsque Controller reçoit une requête, tous les paramètres sont Strings. Spring / Jackson a une liste de convertisseurs prédéfinis pour la plupart des types de base: - Chaîne > Integer - Chaîne > Booléen

Mais il n'y a pas de chaîne par défaut > Convertisseur instantané.

Vous devez en créer et en enregistrer un. Ou vous pouvez changer le type d'entrée en quelque chose que Spring peut gérer avec l'annotation @DateTimeFormat : Comment accepter la date params dans une demande GET au contrôleur Spring MVC?

 0
Author: A. Tim, 2017-06-30 17:16:27

Je soupçonne que le @DateTimeFormat ne fonctionnera pas pour les champs Instant. Spécifiquement, Instant n'est pas répertorié comme l'un des types pour lesquels il fonctionne dans le document de référence Spring.

ConsultezSpring Reference Section 9.5 pour plus de détails sur la conversion de type personnalisé Spring. Créer un convertisseur Converter<String, Instant>. La section 9.5.5 couvre l'enregistrement du convertisseur de type personnalisé.

 0
Author: DwB, 2017-06-30 17:30:27

Peut-être que cela peut vous aider? sérialiser/désérialiser java 8 java.temps avec Jackson JSON mapper Je vois que ce Jackson inclut la classe instantanée.

 0
Author: Spasoje, 2017-07-04 09:43:17