FasterXML / jackson-modules-java8

Set of support modules for Java 8 datatypes (Optionals, date/time) and features (parameter names)
Apache License 2.0
399 stars 116 forks source link

`YearMonthDeserializer` fails for year > 9999 #249

Closed bent-lorentzen closed 1 year ago

bent-lorentzen commented 2 years ago

YearMonths with years outside the range 0000 to 9999 must be prefixed by the plus or minus symbol when the format uuuu-MM (default format) is used. Unfortunately the toString of YearMonth does not add a plus sign for years > 9999. The code

        val writeValueAsString = objectMapper.writeValueAsString(YearMonth.of(10000, 1))
        objectMapper.readValue<YearMonth>(writeValueAsString)

fails with

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.YearMonth` from String "10000-01": Failed to deserialize java.time.YearMonth: (java.time.format.DateTimeParseException) Text '10000-01' could not be parsed at index 0
 at [Source: (String)""10000-01""; line: 1, column: 1]

Changing the constructor

    public YearMonthDeserializer() // public since 2.12
    {
        this(DateTimeFormatter.ofPattern("uuuu-MM"));
    }

to

    public YearMonthDeserializer() // public since 2.12
    {
        this(DateTimeFormatter.ofPattern("u-MM"));
    }

solves this problem,

cowtowncoder commented 1 year ago

I was first unable to reproduce, since the default serialization of YearMonth is an array (with 2.14 at least?), but when forcing output as String issue occurs.