16
16
17
17
package com .fasterxml .jackson .datatype .jsr310 .deser ;
18
18
19
+ import com .fasterxml .jackson .annotation .JsonFormat ;
19
20
import com .fasterxml .jackson .core .JsonParser ;
20
21
import com .fasterxml .jackson .core .JsonTokenId ;
22
+ import com .fasterxml .jackson .databind .BeanProperty ;
21
23
import com .fasterxml .jackson .databind .DeserializationContext ;
22
24
import com .fasterxml .jackson .databind .DeserializationFeature ;
23
25
import com .fasterxml .jackson .databind .JsonDeserializer ;
26
+ import com .fasterxml .jackson .databind .JsonMappingException ;
24
27
import com .fasterxml .jackson .datatype .jsr310 .DecimalUtils ;
25
28
26
29
import java .io .IOException ;
@@ -82,6 +85,8 @@ public class InstantDeserializer<T extends Temporal>
82
85
83
86
protected final BiFunction <T , ZoneId , T > adjust ;
84
87
88
+ protected final Boolean adjustToContextTimezoneOverride ;
89
+
85
90
/**
86
91
* In case of vanilla `Instant` we seem to need to translate "+0000"
87
92
* timezone designator into plain "Z" for some reason; see
@@ -104,6 +109,7 @@ protected InstantDeserializer(Class<T> supportedType,
104
109
this .fromMilliseconds = fromMilliseconds ;
105
110
this .fromNanoseconds = fromNanoseconds ;
106
111
this .adjust = adjust == null ? ((d , z ) -> d ) : adjust ;
112
+ this .adjustToContextTimezoneOverride = null ;
107
113
this .replace0000AsZ = replace0000AsZ ;
108
114
}
109
115
@@ -116,6 +122,19 @@ protected InstantDeserializer(InstantDeserializer<T> base, DateTimeFormatter f)
116
122
fromNanoseconds = base .fromNanoseconds ;
117
123
adjust = base .adjust ;
118
124
replace0000AsZ = (_formatter == DateTimeFormatter .ISO_INSTANT );
125
+ adjustToContextTimezoneOverride = base .adjustToContextTimezoneOverride ;
126
+ }
127
+
128
+ @ SuppressWarnings ("unchecked" )
129
+ protected InstantDeserializer (InstantDeserializer <T > base , Boolean adjustToContextTimezoneOverride )
130
+ {
131
+ super ((Class <T >) base .handledType (), base ._formatter );
132
+ parsedToValue = base .parsedToValue ;
133
+ fromMilliseconds = base .fromMilliseconds ;
134
+ fromNanoseconds = base .fromNanoseconds ;
135
+ adjust = base .adjust ;
136
+ replace0000AsZ = base .replace0000AsZ ;
137
+ this .adjustToContextTimezoneOverride = adjustToContextTimezoneOverride ;
119
138
}
120
139
121
140
@ Override
@@ -173,7 +192,7 @@ public T deserialize(JsonParser parser, DeserializationContext context) throws I
173
192
try {
174
193
TemporalAccessor acc = _formatter .parse (string );
175
194
value = parsedToValue .apply (acc );
176
- if (context . isEnabled ( DeserializationFeature . ADJUST_DATES_TO_CONTEXT_TIME_ZONE )) {
195
+ if (isAdjustToContextTimezone ( context )) {
177
196
return adjust .apply (value , this .getZone (context ));
178
197
}
179
198
} catch (DateTimeException e ) {
@@ -190,6 +209,27 @@ public T deserialize(JsonParser parser, DeserializationContext context) throws I
190
209
throw context .mappingException ("Expected type float, integer, or string." );
191
210
}
192
211
212
+ @ SuppressWarnings ("unchecked" )
213
+ @ Override
214
+ public JsonDeserializer <T > createContextual (DeserializationContext ctxt ,
215
+ BeanProperty property ) throws JsonMappingException
216
+ {
217
+ InstantDeserializer <T > deserializer =
218
+ (InstantDeserializer <T >)super .createContextual (ctxt , property );
219
+ if (deserializer != this ) {
220
+ JsonFormat .Value val = findFormatOverrides (ctxt , property , handledType ());
221
+ if (val != null ) {
222
+ return new InstantDeserializer <>(deserializer , val .getFeature (JsonFormat .Feature .ADJUST_DATES_TO_CONTEXT_TIME_ZONE ));
223
+ }
224
+ }
225
+ return this ;
226
+ }
227
+
228
+ private boolean isAdjustToContextTimezone (DeserializationContext context ) {
229
+ return adjustToContextTimezoneOverride != null ? adjustToContextTimezoneOverride :
230
+ context .isEnabled (DeserializationFeature .ADJUST_DATES_TO_CONTEXT_TIME_ZONE );
231
+ }
232
+
193
233
/**
194
234
* Helper method to find Strings of form "all digits" and "digits-comma-digits"
195
235
*/
0 commit comments