3
3
import java .io .IOException ;
4
4
import java .lang .reflect .Constructor ;
5
5
import java .lang .reflect .Method ;
6
+ import java .net .MalformedURLException ;
6
7
import java .net .URI ;
7
8
import java .net .URL ;
8
9
import java .util .*;
@@ -110,7 +111,7 @@ public static StdKeyDeserializer forType(Class<?> raw)
110
111
}
111
112
return new StdKeyDeserializer (kind , raw );
112
113
}
113
-
114
+
114
115
@ Override
115
116
public Object deserializeKey (String key , DeserializationContext ctxt )
116
117
throws IOException
@@ -124,14 +125,12 @@ public Object deserializeKey(String key, DeserializationContext ctxt)
124
125
return result ;
125
126
}
126
127
} catch (Exception re ) {
127
- ctxt .reportWeirdKeyException (_keyClass , key , "not a valid representation: %s" , re .getMessage ());
128
- return null ;
128
+ return ctxt .handleWeirdKey (_keyClass , key , "not a valid representation: %s" , re .getMessage ());
129
129
}
130
130
if (_keyClass .isEnum () && ctxt .getConfig ().isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_AS_NULL )) {
131
131
return null ;
132
132
}
133
- ctxt .reportWeirdKeyException (_keyClass , key , "not a valid representation" );
134
- return null ;
133
+ return ctxt .handleWeirdKey (_keyClass , key , "not a valid representation" );
135
134
}
136
135
137
136
public Class <?> getKeyClass () { return _keyClass ; }
@@ -146,23 +145,21 @@ protected Object _parse(String key, DeserializationContext ctxt) throws Exceptio
146
145
if ("false" .equals (key )) {
147
146
return Boolean .FALSE ;
148
147
}
149
- ctxt .reportWeirdKeyException (_keyClass , key , "value not 'true' or 'false'" );
150
- break ;
148
+ return ctxt .handleWeirdKey (_keyClass , key , "value not 'true' or 'false'" );
151
149
case TYPE_BYTE :
152
150
{
153
151
int value = _parseInt (key );
154
- // as per [JACKSON-804], allow range up to 255, inclusive
152
+ // allow range up to 255, inclusive (to support "unsigned" byte)
155
153
if (value < Byte .MIN_VALUE || value > 255 ) {
156
- ctxt .reportWeirdKeyException (_keyClass , key , "overflow, value can not be represented as 8-bit value" );
157
- // fall-through and truncate if need be
154
+ return ctxt .handleWeirdKey (_keyClass , key , "overflow, value can not be represented as 8-bit value" );
158
155
}
159
156
return Byte .valueOf ((byte ) value );
160
157
}
161
158
case TYPE_SHORT :
162
159
{
163
160
int value = _parseInt (key );
164
161
if (value < Short .MIN_VALUE || value > Short .MAX_VALUE ) {
165
- ctxt .reportWeirdKeyException (_keyClass , key , "overflow, value can not be represented as 16-bit value" );
162
+ return ctxt .handleWeirdKey (_keyClass , key , "overflow, value can not be represented as 16-bit value" );
166
163
// fall-through and truncate if need be
167
164
}
168
165
return Short .valueOf ((short ) value );
@@ -171,8 +168,7 @@ protected Object _parse(String key, DeserializationContext ctxt) throws Exceptio
171
168
if (key .length () == 1 ) {
172
169
return Character .valueOf (key .charAt (0 ));
173
170
}
174
- ctxt .reportWeirdKeyException (_keyClass , key , "can only convert 1-character Strings" );
175
- break ;
171
+ return ctxt .handleWeirdKey (_keyClass , key , "can only convert 1-character Strings" );
176
172
case TYPE_INT :
177
173
return _parseInt (key );
178
174
@@ -188,41 +184,46 @@ protected Object _parse(String key, DeserializationContext ctxt) throws Exceptio
188
184
try {
189
185
return _deser ._deserialize (key , ctxt );
190
186
} catch (IOException e ) {
191
- ctxt .reportWeirdKeyException (_keyClass , key , "unable to parse key as locale" );
187
+ return ctxt .handleWeirdKey (_keyClass , key , "unable to parse key as locale" );
192
188
}
193
- break ;
194
189
case TYPE_CURRENCY :
195
190
try {
196
191
return _deser ._deserialize (key , ctxt );
197
192
} catch (IOException e ) {
198
- ctxt .reportWeirdKeyException (_keyClass , key , "unable to parse key as currency" );
193
+ return ctxt .handleWeirdKey (_keyClass , key , "unable to parse key as currency" );
199
194
}
200
- break ;
201
195
case TYPE_DATE :
202
196
return ctxt .parseDate (key );
203
197
case TYPE_CALENDAR :
204
198
java .util .Date date = ctxt .parseDate (key );
205
199
return (date == null ) ? null : ctxt .constructCalendar (date );
206
200
case TYPE_UUID :
207
- return UUID .fromString (key );
201
+ try {
202
+ return UUID .fromString (key );
203
+ } catch (Exception e ) {
204
+ return ctxt .handleWeirdKey (_keyClass , key , "problem: %s" , e .getMessage ());
205
+ }
208
206
case TYPE_URI :
209
- return URI .create (key );
207
+ try {
208
+ return URI .create (key );
209
+ } catch (Exception e ) {
210
+ return ctxt .handleWeirdKey (_keyClass , key , "problem: %s" , e .getMessage ());
211
+ }
210
212
case TYPE_URL :
211
- return new URL (key );
213
+ try {
214
+ return new URL (key );
215
+ } catch (MalformedURLException e ) {
216
+ return ctxt .handleWeirdKey (_keyClass , key , "problem: %s" , e .getMessage ());
217
+ }
212
218
case TYPE_CLASS :
213
219
try {
214
220
return ctxt .findClass (key );
215
221
} catch (Exception e ) {
216
- ctxt .reportWeirdKeyException (_keyClass , key , "unable to parse key as Class" );
222
+ return ctxt .handleWeirdKey (_keyClass , key , "unable to parse key as Class" );
217
223
}
218
- break ;
219
224
default :
220
225
throw new IllegalStateException ("Internal error: unknown key type " +_keyClass );
221
226
}
222
- // 05-May-2016, tatu: In future, we may end up here if `reportWeirdKeyException()`
223
- // collects failure messages and does not immediately throw. Not 100% sure what
224
- // should be done; returning `null` seems least evil for now
225
- return null ;
226
227
}
227
228
228
229
/*
@@ -314,13 +315,10 @@ public final Object deserializeKey(String key, DeserializationContext ctxt)
314
315
if (result != null ) {
315
316
return result ;
316
317
}
317
- ctxt .reportWeirdKeyException (_keyClass , key , "not a valid representation" );
318
+ return ctxt .handleWeirdKey (_keyClass , key , "not a valid representation" );
318
319
} catch (Exception re ) {
319
- ctxt .reportWeirdKeyException (_keyClass , key , "not a valid representation: " + re .getMessage ());
320
+ return ctxt .handleWeirdKey (_keyClass , key , "not a valid representation: %s" , re .getMessage ());
320
321
}
321
- // 05-May-2016, tatu: Can't happen now (2.8), but in future exceptions may
322
- // be deferred.
323
- return null ;
324
322
}
325
323
326
324
public Class <?> getKeyClass () { return _keyClass ; }
@@ -350,7 +348,7 @@ protected EnumKD(EnumResolver er, AnnotatedMethod factory) {
350
348
}
351
349
352
350
@ Override
353
- public Object _parse (String key , DeserializationContext ctxt ) throws JsonMappingException
351
+ public Object _parse (String key , DeserializationContext ctxt ) throws IOException
354
352
{
355
353
if (_factory != null ) {
356
354
try {
@@ -363,7 +361,7 @@ public Object _parse(String key, DeserializationContext ctxt) throws JsonMapping
363
361
? _getToStringResolver (ctxt ) : _byNameResolver ;
364
362
Enum <?> e = res .findEnum (key );
365
363
if ((e == null ) && !ctxt .getConfig ().isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_AS_NULL )) {
366
- ctxt .reportWeirdKeyException (_keyClass , key , "not one of values excepted for Enum class: %s" ,
364
+ return ctxt .handleWeirdKey (_keyClass , key , "not one of values excepted for Enum class: %s" ,
367
365
res .getEnumIds ());
368
366
// fall-through if problems are collected, not immediately thrown
369
367
}
0 commit comments