Skip to content

YearMonthDeserializer fails for year > 9999 #249

@bent-lorentzen

Description

@bent-lorentzen

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,

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions