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"));
}
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.
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
fails with
Changing the constructor
to
solves this problem,