1
16
17 package com.fasterxml.jackson.datatype.jsr310;
18
19 import java.time.*;
20
21 import com.fasterxml.jackson.databind.BeanDescription;
22 import com.fasterxml.jackson.databind.DeserializationConfig;
23 import com.fasterxml.jackson.databind.JavaType;
24 import com.fasterxml.jackson.databind.deser.ValueInstantiator;
25 import com.fasterxml.jackson.databind.deser.ValueInstantiators;
26 import com.fasterxml.jackson.databind.deser.std.StdValueInstantiator;
27 import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
28 import com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver;
29 import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
30 import com.fasterxml.jackson.databind.module.SimpleModule;
31 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
32 import com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer;
33 import com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer;
34 import com.fasterxml.jackson.datatype.jsr310.deser.JSR310StringParsableDeserializer;
35 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
36 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
37 import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
38 import com.fasterxml.jackson.datatype.jsr310.deser.MonthDayDeserializer;
39 import com.fasterxml.jackson.datatype.jsr310.deser.OffsetTimeDeserializer;
40 import com.fasterxml.jackson.datatype.jsr310.deser.YearDeserializer;
41 import com.fasterxml.jackson.datatype.jsr310.deser.YearMonthDeserializer;
42 import com.fasterxml.jackson.datatype.jsr310.deser.key.*;
43 import com.fasterxml.jackson.datatype.jsr310.ser.DurationSerializer;
44 import com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializer;
45 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
46 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
47 import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
48 import com.fasterxml.jackson.datatype.jsr310.ser.MonthDaySerializer;
49 import com.fasterxml.jackson.datatype.jsr310.ser.OffsetDateTimeSerializer;
50 import com.fasterxml.jackson.datatype.jsr310.ser.OffsetTimeSerializer;
51 import com.fasterxml.jackson.datatype.jsr310.ser.YearMonthSerializer;
52 import com.fasterxml.jackson.datatype.jsr310.ser.YearSerializer;
53 import com.fasterxml.jackson.datatype.jsr310.ser.ZoneIdSerializer;
54 import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer;
55 import com.fasterxml.jackson.datatype.jsr310.ser.key.ZonedDateTimeKeySerializer;
56
57
107 @SuppressWarnings("javadoc")
108 public final class JavaTimeModule extends SimpleModule
109 {
110 private static final long serialVersionUID = 1L;
111
112 public JavaTimeModule()
113 {
114 super(PackageVersion.VERSION);
115
116
117
118
119 addDeserializer(Instant.class, InstantDeserializer.INSTANT);
120 addDeserializer(OffsetDateTime.class, InstantDeserializer.OFFSET_DATE_TIME);
121 addDeserializer(ZonedDateTime.class, InstantDeserializer.ZONED_DATE_TIME);
122
123
124 addDeserializer(Duration.class, DurationDeserializer.INSTANCE);
125 addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
126 addDeserializer(LocalDate.class, LocalDateDeserializer.INSTANCE);
127 addDeserializer(LocalTime.class, LocalTimeDeserializer.INSTANCE);
128 addDeserializer(MonthDay.class, MonthDayDeserializer.INSTANCE);
129 addDeserializer(OffsetTime.class, OffsetTimeDeserializer.INSTANCE);
130 addDeserializer(Period.class, JSR310StringParsableDeserializer.PERIOD);
131 addDeserializer(Year.class, YearDeserializer.INSTANCE);
132 addDeserializer(YearMonth.class, YearMonthDeserializer.INSTANCE);
133 addDeserializer(ZoneId.class, JSR310StringParsableDeserializer.ZONE_ID);
134 addDeserializer(ZoneOffset.class, JSR310StringParsableDeserializer.ZONE_OFFSET);
135
136
137 addSerializer(Duration.class, DurationSerializer.INSTANCE);
138 addSerializer(Instant.class, InstantSerializer.INSTANCE);
139 addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
140 addSerializer(LocalDate.class, LocalDateSerializer.INSTANCE);
141 addSerializer(LocalTime.class, LocalTimeSerializer.INSTANCE);
142 addSerializer(MonthDay.class, MonthDaySerializer.INSTANCE);
143 addSerializer(OffsetDateTime.class, OffsetDateTimeSerializer.INSTANCE);
144 addSerializer(OffsetTime.class, OffsetTimeSerializer.INSTANCE);
145 addSerializer(Period.class, new ToStringSerializer(Period.class));
146 addSerializer(Year.class, YearSerializer.INSTANCE);
147 addSerializer(YearMonth.class, YearMonthSerializer.INSTANCE);
148
149
154 addSerializer(ZonedDateTime.class, ZonedDateTimeSerializer.INSTANCE);
155
156
157
158 addSerializer(ZoneId.class, new ZoneIdSerializer());
159 addSerializer(ZoneOffset.class, new ToStringSerializer(ZoneOffset.class));
160
161
162 addKeySerializer(ZonedDateTime.class, ZonedDateTimeKeySerializer.INSTANCE);
163
164
165 addKeyDeserializer(Duration.class, DurationKeyDeserializer.INSTANCE);
166 addKeyDeserializer(Instant.class, InstantKeyDeserializer.INSTANCE);
167 addKeyDeserializer(LocalDateTime.class, LocalDateTimeKeyDeserializer.INSTANCE);
168 addKeyDeserializer(LocalDate.class, LocalDateKeyDeserializer.INSTANCE);
169 addKeyDeserializer(LocalTime.class, LocalTimeKeyDeserializer.INSTANCE);
170 addKeyDeserializer(MonthDay.class, MonthDayKeyDeserializer.INSTANCE);
171 addKeyDeserializer(OffsetDateTime.class, OffsetDateTimeKeyDeserializer.INSTANCE);
172 addKeyDeserializer(OffsetTime.class, OffsetTimeKeyDeserializer.INSTANCE);
173 addKeyDeserializer(Period.class, PeriodKeyDeserializer.INSTANCE);
174 addKeyDeserializer(Year.class, YearKeyDeserializer.INSTANCE);
175 addKeyDeserializer(YearMonth.class, YearMonthKeyDeserializer.INSTANCE);
176 addKeyDeserializer(ZonedDateTime.class, ZonedDateTimeKeyDeserializer.INSTANCE);
177 addKeyDeserializer(ZoneId.class, ZoneIdKeyDeserializer.INSTANCE);
178 addKeyDeserializer(ZoneOffset.class, ZoneOffsetKeyDeserializer.INSTANCE);
179 }
180
181 @Override
182 public void setupModule(SetupContext context) {
183 super.setupModule(context);
184 context.addValueInstantiators(new ValueInstantiators.Base() {
185 @Override
186 public ValueInstantiator findValueInstantiator(DeserializationConfig config,
187 BeanDescription beanDesc, ValueInstantiator defaultInstantiator)
188 {
189 JavaType type = beanDesc.getType();
190 Class<?> raw = type.getRawClass();
191
192
193
194
195
196 if (ZoneId.class.isAssignableFrom(raw)) {
197
198 if (defaultInstantiator instanceof StdValueInstantiator) {
199 StdValueInstantiator inst = (StdValueInstantiator) defaultInstantiator;
200
201 AnnotatedClass ac;
202 if (raw == ZoneId.class) {
203 ac = beanDesc.getClassInfo();
204 } else {
205
206
207 ac = AnnotatedClassResolver.resolve(config,
208 config.constructType(ZoneId.class), config);
209 }
210 if (!inst.canCreateFromString()) {
211 AnnotatedMethod factory = _findFactory(ac, "of", String.class);
212 if (factory != null) {
213 inst.configureFromStringCreator(factory);
214 }
215
216 }
217
218 }
219 }
220 return defaultInstantiator;
221 }
222 });
223 }
224
225 protected AnnotatedMethod _findFactory(AnnotatedClass cls, String name, Class<?>... argTypes)
226 {
227 final int argCount = argTypes.length;
228 for (AnnotatedMethod method : cls.getFactoryMethods()) {
229 if (!name.equals(method.getName())
230 || (method.getParameterCount() != argCount)) {
231 continue;
232 }
233 for (int i = 0; i < argCount; ++i) {
234 Class<?> argType = method.getParameter(i).getRawType();
235 if (!argType.isAssignableFrom(argTypes[i])) {
236 continue;
237 }
238 }
239 return method;
240 }
241 return null;
242 }
243 }
244