2 votes

Jackson LocalDate date inexistante

Considérez la classe d'exemple suivante :

public class TheDto {
    @JsonFormat(shape = Shape.STRING, pattern = "yyMMdd", lenient = OptBoolean.FALSE)
    private Date date;
    @JsonFormat(shape = Shape.STRING, pattern = "yyMMdd", lenient = OptBoolean.FALSE)
    private LocalDate localDate;
}

Pour la même entrée, "180231", le champ date échoue à être analysé, car le 31 février n'existe pas.
Mais, localDate réussit avec la valeur "180228".
Existe-t-il un moyen d'imposer LocalDate lenient=false, pour valider strictement l'existence de la date?

1voto

Cássio Mazzochi Molin Points 11962

Je vous conseille d'utiliser le standard ISO 8601 chaque fois que possible, qui est soutenu par le RFC 3339 et également par le xkcd 1179 :)


Si un tel standard n'est pas une option pour votre application, vous pouvez créer votre propre désérialiseur, où vous spécifiez votre propre DateTimeFormatter avec un ResolverStyle qui peut être LENIENT, SMART ou STRICT:

public class CustomLocalDateDeserializer extends JsonDeserializer {

    private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
            .appendPattern("yyMMdd")
            .parseDefaulting(ChronoField.ERA, 1)
            .toFormatter()
            .withChronology(IsoChronology.INSTANCE)
            .withResolverStyle(ResolverStyle.STRICT); // Also can be LENIENT or SMART

    @Override
    public LocalDate deserialize(JsonParser p,
                                 DeserializationContext ctxt) throws IOException {

        String value = p.getValueAsString();
        return LocalDate.parse(value, FORMATTER);
    }
}

Et ensuite l'utiliser comme suit:

public class Foo {

    @JsonDeserialize(using = CustomLocalDateDeserializer.class)
    private LocalDate date;

    // Getters and setters
}

String json = "{\"date\":\"180231\"}";

ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(json, Foo.class);

Considérez yyMMdd comme le format de date et 180231 comme l'entrée. Vous aurez des résultats différents selon le ResolverStyle:

  • LENIENT: La valeur de date sera 2018-03-03.
  • SMART: La valeur de date sera 2018-02-28.
  • STRICT: Une exception sera levée: Date invalide 'FEBRUARY 31'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X