1 package com.fasterxml.jackson.datatype.jsr310.deser.key;
2
3 import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
4 import static java.time.temporal.ChronoField.YEAR;
5
6 import java.io.IOException;
7 import java.time.DateTimeException;
8 import java.time.YearMonth;
9 import java.time.format.DateTimeFormatter;
10 import java.time.format.DateTimeFormatterBuilder;
11 import java.time.format.SignStyle;
12
13 import com.fasterxml.jackson.databind.DeserializationContext;
14
15 /**
16  * @since 2.10 (had a typo previously)
17  */

18 public class YearMonthKeyDeserializer extends Jsr310KeyDeserializer {
19     public static final YearMonthKeyDeserializer INSTANCE = new YearMonthKeyDeserializer();
20
21     // parser copied from YearMonth
22     private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
23             .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
24             .appendLiteral('-')
25             .appendValue(MONTH_OF_YEAR, 2)
26             .toFormatter();
27
28     protected YearMonthKeyDeserializer() { } // only protected for 2.10, to allow sub-class
29
30     @Override
31     protected YearMonth deserialize(String key, DeserializationContext ctxt) throws IOException {
32         try {
33             return YearMonth.parse(key, FORMATTER);
34         } catch (DateTimeException e) {
35             return _handleDateTimeException(ctxt, YearMonth.class, e, key);
36         }
37     }
38 }
39