From 7a8513d08030888d1813b0bfe20f2a2b139f327f Mon Sep 17 00:00:00 2001 From: Semen Levin Date: Tue, 3 Apr 2018 16:23:36 +0300 Subject: [PATCH 1/3] use DeserializationContext.handleWeirdStringValue for DateTimeException --- .../jsr310/deser/DurationDeserializer.java | 2 +- .../jsr310/deser/InstantDeserializer.java | 2 +- .../jsr310/deser/JSR310DeserializerBase.java | 32 ++++++++----------- .../JSR310StringParsableDeserializer.java | 2 +- .../jsr310/deser/LocalDateDeserializer.java | 2 +- .../deser/LocalDateTimeDeserializer.java | 2 +- .../jsr310/deser/LocalTimeDeserializer.java | 2 +- .../jsr310/deser/MonthDayDeserializer.java | 2 +- .../jsr310/deser/OffsetTimeDeserializer.java | 2 +- .../jsr310/deser/YearDeserializer.java | 2 +- .../jsr310/deser/YearMonthDeserializer.java | 2 +- .../deser/key/DurationKeyDeserializer.java | 2 +- .../deser/key/InstantKeyDeserializer.java | 2 +- .../deser/key/Jsr310KeyDeserializer.java | 29 ++++++++++------- .../deser/key/LocalDateKeyDeserializer.java | 2 +- .../key/LocalDateTimeKeyDeserializer.java | 2 +- .../deser/key/LocalTimeKeyDeserializer.java | 2 +- .../deser/key/MonthDayKeyDeserializer.java | 2 +- .../key/OffsetDateTimeKeyDeserializer.java | 2 +- .../deser/key/OffsetTimeKeyDeserializer.java | 2 +- .../deser/key/PeriodKeyDeserializer.java | 2 +- .../jsr310/deser/key/YearKeyDeserializer.java | 2 +- .../deser/key/YearMothKeyDeserializer.java | 2 +- .../deser/key/ZoneIdKeyDeserializer.java | 2 +- .../deser/key/ZoneOffsetKeyDeserializer.java | 2 +- .../key/ZonedDateTimeKeyDeserializer.java | 2 +- 26 files changed, 55 insertions(+), 54 deletions(-) diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java index 132fdaf0..37cbabe6 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java @@ -70,7 +70,7 @@ public Duration deserialize(JsonParser parser, DeserializationContext context) t try { return Duration.parse(string); } catch (DateTimeException e) { - return _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } case JsonTokenId.ID_EMBEDDED_OBJECT: // 20-Apr-2016, tatu: Related to [databind#1208], can try supporting embedded diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java index c55bd962..655ff32f 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java @@ -209,7 +209,7 @@ public T deserialize(JsonParser parser, DeserializationContext context) throws I return adjust.apply(value, this.getZone(context)); } } catch (DateTimeException e) { - value = _rethrowDateTimeException(parser, context, e, string); + value = _handleDateTimeException(context, e, string); } return value; } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java index 80599bcb..59c79600 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java @@ -38,7 +38,7 @@ abstract class JSR310DeserializerBase extends StdScalarDeserializer { private static final long serialVersionUID = 1L; - + protected JSR310DeserializerBase(Class supportedType) { super(supportedType); @@ -73,35 +73,31 @@ protected BOGUS _reportWrongToken(JsonParser parser, DeserializationCont handledType().getName()); } - protected BOGUS _rethrowDateTimeException(JsonParser p, DeserializationContext context, - DateTimeException e0, String value) throws JsonMappingException + @SuppressWarnings("unchecked") + protected R _handleDateTimeException(DeserializationContext context, + DateTimeException e0, String value) throws JsonMappingException { - JsonMappingException e; - if (e0 instanceof DateTimeParseException) { - e = context.weirdStringException(value, handledType(), e0.getMessage()); + try { + return (R) context.handleWeirdStringValue(handledType(), value, + "Failed to deserialize %s: (%s) %s", + handledType().getName(), e0.getClass().getName(), e0.getMessage()); + + } catch (JsonMappingException e) { e.initCause(e0); throw e; - } - if (e0 instanceof DateTimeException) { - String msg = e0.getMessage(); - // 26-Mar-2017, tatu: Let's add some more logic to try to find likely format(ting) - // issues - if (msg.contains("invalid format")) { - e = context.weirdStringException(value, handledType(), e0.getMessage()); + } catch (IOException e) { + if (null == e.getCause()) { e.initCause(e0); - throw e; } + throw JsonMappingException.fromUnexpectedIOE(e); } - return context.reportInputMismatch(handledType(), - "Failed to deserialize %s: (%s) %s", - handledType().getName(), e0.getClass().getName(), e0.getMessage()); } /** * Helper method used to peel off spurious wrappings of DateTimeException * * @param e DateTimeException to peel - * + * * @return DateTimeException that does not have another DateTimeException as its cause. */ protected DateTimeException _peelDTE(DateTimeException e) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310StringParsableDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310StringParsableDeserializer.java index 750ecf6d..24b2b862 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310StringParsableDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310StringParsableDeserializer.java @@ -89,7 +89,7 @@ public Object deserialize(JsonParser parser, DeserializationContext context) thr return ZoneOffset.of(string); } } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java index 0ad047b7..b782507a 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java @@ -80,7 +80,7 @@ public LocalDate deserialize(JsonParser parser, DeserializationContext context) } return LocalDate.parse(string, format); } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (parser.isExpectedStartArrayToken()) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java index 73ae05d4..941cfcc6 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java @@ -81,7 +81,7 @@ public LocalDateTime deserialize(JsonParser parser, DeserializationContext conte return LocalDateTime.parse(string, _formatter); } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (parser.isExpectedStartArrayToken()) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java index 03f2af3d..9a91dc52 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java @@ -71,7 +71,7 @@ public LocalTime deserialize(JsonParser parser, DeserializationContext context) } return LocalTime.parse(string, format); } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (parser.isExpectedStartArrayToken()) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java index b178e492..1499b0f9 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java @@ -39,7 +39,7 @@ public MonthDay deserialize(JsonParser parser, DeserializationContext context) t } return MonthDay.parse(string, _formatter); } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/OffsetTimeDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/OffsetTimeDeserializer.java index 6c01a1aa..1c6f461d 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/OffsetTimeDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/OffsetTimeDeserializer.java @@ -60,7 +60,7 @@ public OffsetTime deserialize(JsonParser parser, DeserializationContext context) try { return OffsetTime.parse(string, _formatter); } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (!parser.isExpectedStartArrayToken()) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java index 9490c6d6..e92b3563 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java @@ -61,7 +61,7 @@ public Year deserialize(JsonParser parser, DeserializationContext context) throw } return Year.parse(string, _formatter); } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (t == JsonToken.VALUE_NUMBER_INT) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java index c7cd83dd..e0a6b92c 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java @@ -66,7 +66,7 @@ public YearMonth deserialize(JsonParser parser, DeserializationContext context) try { return YearMonth.parse(string, _formatter); } catch (DateTimeException e) { - _rethrowDateTimeException(parser, context, e, string); + return _handleDateTimeException(context, e, string); } } if (parser.isExpectedStartArrayToken()) { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/DurationKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/DurationKeyDeserializer.java index 7e46db7e..6cda7875 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/DurationKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/DurationKeyDeserializer.java @@ -19,7 +19,7 @@ protected Duration deserialize(String key, DeserializationContext ctxt) throws I try { return Duration.parse(key); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, Duration.class, e, key); + return _handleDateTimeException(ctxt, Duration.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/InstantKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/InstantKeyDeserializer.java index 8cabe7c3..57736676 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/InstantKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/InstantKeyDeserializer.java @@ -20,7 +20,7 @@ protected Instant deserialize(String key, DeserializationContext ctxt) throws IO try { return DateTimeFormatter.ISO_INSTANT.parse(key, Instant::from); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, Instant.class, e, key); + return _handleDateTimeException(ctxt, Instant.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/Jsr310KeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/Jsr310KeyDeserializer.java index 0d97dc38..1796cfac 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/Jsr310KeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/Jsr310KeyDeserializer.java @@ -24,19 +24,24 @@ public final Object deserializeKey(String key, DeserializationContext ctxt) protected abstract Object deserialize(String key, DeserializationContext ctxt) throws IOException; - - protected T _rethrowDateTimeException(DeserializationContext ctxt, - Class type, DateTimeException e0, String value) throws IOException + + @SuppressWarnings("unchecked") + protected T _handleDateTimeException(DeserializationContext ctxt, + Class type, DateTimeException e0, String value) throws IOException { - JsonMappingException e; - if (e0 instanceof DateTimeParseException) { - e = ctxt.weirdStringException(value, type, e0.getMessage()); + try { + return (T) ctxt.handleWeirdStringValue(type, value, + "Failed to deserialize %s: (%s) %s", + type.getName(), e0.getClass().getName(), e0.getMessage()); + + } catch (JsonMappingException e) { e.initCause(e0); - } else { - e = JsonMappingException.from(ctxt, - String.format("Failed to deserialize %s: (%s) %s", - type.getName(), e0.getClass().getName(), e0.getMessage()), e0); + throw e; + } catch (IOException e) { + if (null == e.getCause()) { + e.initCause(e0); + } + throw JsonMappingException.fromUnexpectedIOE(e); } - throw e; } -} \ No newline at end of file +} diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateKeyDeserializer.java index f4d4900a..ba0681d0 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateKeyDeserializer.java @@ -20,7 +20,7 @@ protected LocalDate deserialize(String key, DeserializationContext ctxt) throws try { return LocalDate.parse(key, DateTimeFormatter.ISO_LOCAL_DATE); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, LocalDate.class, e, key); + return _handleDateTimeException(ctxt, LocalDate.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateTimeKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateTimeKeyDeserializer.java index ed041fd7..52b07395 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateTimeKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalDateTimeKeyDeserializer.java @@ -20,7 +20,7 @@ protected LocalDateTime deserialize(String key, DeserializationContext ctxt) thr try { return LocalDateTime.parse(key, DateTimeFormatter.ISO_LOCAL_DATE_TIME); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, LocalDateTime.class, e, key); + return _handleDateTimeException(ctxt, LocalDateTime.class, e, key); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalTimeKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalTimeKeyDeserializer.java index c5d1b091..cf4869d2 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalTimeKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/LocalTimeKeyDeserializer.java @@ -20,7 +20,7 @@ protected LocalTime deserialize(String key, DeserializationContext ctxt) throws try { return LocalTime.parse(key, DateTimeFormatter.ISO_LOCAL_TIME); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, LocalTime.class, e, key); + return _handleDateTimeException(ctxt, LocalTime.class, e, key); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/MonthDayKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/MonthDayKeyDeserializer.java index 9adca36e..9bc63228 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/MonthDayKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/MonthDayKeyDeserializer.java @@ -32,7 +32,7 @@ protected MonthDay deserialize(String key, DeserializationContext ctxt) throws I try { return MonthDay.parse(key, PARSER); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, MonthDay.class, e, key); + return _handleDateTimeException(ctxt, MonthDay.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetDateTimeKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetDateTimeKeyDeserializer.java index bdab4be0..9cabd0a8 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetDateTimeKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetDateTimeKeyDeserializer.java @@ -20,7 +20,7 @@ protected OffsetDateTime deserialize(String key, DeserializationContext ctxt) th try { return OffsetDateTime.parse(key, DateTimeFormatter.ISO_OFFSET_DATE_TIME); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, OffsetDateTime.class, e, key); + return _handleDateTimeException(ctxt, OffsetDateTime.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetTimeKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetTimeKeyDeserializer.java index 91d81bf6..57e62d83 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetTimeKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/OffsetTimeKeyDeserializer.java @@ -20,7 +20,7 @@ protected OffsetTime deserialize(String key, DeserializationContext ctxt) throws try { return OffsetTime.parse(key, DateTimeFormatter.ISO_OFFSET_TIME); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, OffsetTime.class, e, key); + return _handleDateTimeException(ctxt, OffsetTime.class, e, key); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/PeriodKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/PeriodKeyDeserializer.java index 248da1dc..f4fb5b65 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/PeriodKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/PeriodKeyDeserializer.java @@ -19,7 +19,7 @@ protected Period deserialize(String key, DeserializationContext ctxt) throws IOE try { return Period.parse(key); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, Period.class, e, key); + return _handleDateTimeException(ctxt, Period.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearKeyDeserializer.java index 3e33a5bb..1ffae9b7 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearKeyDeserializer.java @@ -31,7 +31,7 @@ protected Year deserialize(String key, DeserializationContext ctxt) throws IOExc try { return Year.parse(key, FORMATTER); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, Year.class, e, key); + return _handleDateTimeException(ctxt, Year.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearMothKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearMothKeyDeserializer.java index 3a849bee..1aa0d9e3 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearMothKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/YearMothKeyDeserializer.java @@ -32,7 +32,7 @@ protected YearMonth deserialize(String key, DeserializationContext ctxt) throws try { return YearMonth.parse(key, FORMATTER); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, YearMonth.class, e, key); + return _handleDateTimeException(ctxt, YearMonth.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneIdKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneIdKeyDeserializer.java index e320a85f..233df92d 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneIdKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneIdKeyDeserializer.java @@ -19,7 +19,7 @@ protected Object deserialize(String key, DeserializationContext ctxt) throws IOE try { return ZoneId.of(key); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, ZoneId.class, e, key); + return _handleDateTimeException(ctxt, ZoneId.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneOffsetKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneOffsetKeyDeserializer.java index c67e5a71..c01c8b2b 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneOffsetKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZoneOffsetKeyDeserializer.java @@ -19,7 +19,7 @@ protected ZoneOffset deserialize(String key, DeserializationContext ctxt) throws try { return ZoneOffset.of(key); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, ZoneOffset.class, e, key); + return _handleDateTimeException(ctxt, ZoneOffset.class, e, key); } } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZonedDateTimeKeyDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZonedDateTimeKeyDeserializer.java index 2acec0c1..8f700a9b 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZonedDateTimeKeyDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/key/ZonedDateTimeKeyDeserializer.java @@ -21,7 +21,7 @@ protected ZonedDateTime deserialize(String key, DeserializationContext ctxt) thr try { return ZonedDateTime.parse(key, DateTimeFormatter.ISO_OFFSET_DATE_TIME); } catch (DateTimeException e) { - return _rethrowDateTimeException(ctxt, ZonedDateTime.class, e, key); + return _handleDateTimeException(ctxt, ZonedDateTime.class, e, key); } } } From 1ce786ef015526c801d5382d0c1e863435ca7a6f Mon Sep 17 00:00:00 2001 From: Semen Levin Date: Wed, 4 Apr 2018 15:22:10 +0300 Subject: [PATCH 2/3] unit tests --- .../jsr310/deser/DurationDeserializer.java | 2 +- .../jsr310/deser/InstantDeserializer.java | 2 +- .../jsr310/deser/JSR310DeserializerBase.java | 25 +++++++++- .../jsr310/deser/LocalDateDeserializer.java | 3 +- .../deser/LocalDateTimeDeserializer.java | 3 +- .../jsr310/deser/LocalTimeDeserializer.java | 3 +- .../jsr310/deser/MonthDayDeserializer.java | 2 +- .../jsr310/deser/YearDeserializer.java | 2 +- .../jsr310/deser/YearMonthDeserializer.java | 2 +- .../TestLocalDateTimeDeserialization.java | 46 +++++++++++++++++++ .../TestLocalDateTimeKeySerialization.java | 26 +++++++++++ 11 files changed, 104 insertions(+), 12 deletions(-) diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java index 37cbabe6..be0ad8bd 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java @@ -80,7 +80,7 @@ public Duration deserialize(JsonParser parser, DeserializationContext context) t case JsonTokenId.ID_START_ARRAY: return _deserializeFromArray(parser, context); } - return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, + return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT, JsonToken.VALUE_NUMBER_FLOAT); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java index 655ff32f..bec6a0f1 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java @@ -222,7 +222,7 @@ public T deserialize(JsonParser parser, DeserializationContext context) throws I case JsonTokenId.ID_START_ARRAY: return _deserializeFromArray(parser, context); } - return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, + return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT, JsonToken.VALUE_NUMBER_FLOAT); } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java index 59c79600..9a1087f9 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java @@ -18,7 +18,6 @@ import java.io.IOException; import java.time.DateTimeException; -import java.time.format.DateTimeParseException; import java.util.Arrays; import com.fasterxml.jackson.core.JsonParser; @@ -93,6 +92,30 @@ protected R _handleDateTimeException(DeserializationContext context, } } + @SuppressWarnings("unchecked") + protected R _handleUnexpectedToken(DeserializationContext context, + JsonParser parser, String message, Object... args) throws JsonMappingException { + try { + return (R) context.handleUnexpectedToken(handledType(), parser.getCurrentToken(), + parser, message, args); + + } catch (JsonMappingException e) { + throw e; + } catch (IOException e) { + throw JsonMappingException.fromUnexpectedIOE(e); + } + } + + @SuppressWarnings("unchecked") + protected R _handleUnexpectedToken(DeserializationContext context, + JsonParser parser, JsonToken... expTypes) throws JsonMappingException { + return _handleUnexpectedToken(context, parser, + "Unexpected token (%s), expected one of %s for %s value", + parser.currentToken(), + Arrays.asList(expTypes), + handledType().getName()); + } + /** * Helper method used to peel off spurious wrappings of DateTimeException * diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java index b782507a..aae27d4e 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java @@ -118,7 +118,6 @@ public LocalDate deserialize(JsonParser parser, DeserializationContext context) if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) { return LocalDate.ofEpochDay(parser.getLongValue()); } - throw context.wrongTokenException(parser, handledType(), JsonToken.VALUE_STRING, - "Expected array or string."); + return _handleUnexpectedToken(context, parser, "Expected array or string."); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java index 941cfcc6..29241d22 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java @@ -138,7 +138,6 @@ public LocalDateTime deserialize(JsonParser parser, DeserializationContext conte if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) { _throwNoNumericTimestampNeedTimeZone(parser, context); } - throw context.wrongTokenException(parser, handledType(), JsonToken.VALUE_STRING, - "Expected array or string."); + return _handleUnexpectedToken(context, parser, "Expected array or string."); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java index 9a91dc52..a7900cd8 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java @@ -127,7 +127,6 @@ public LocalTime deserialize(JsonParser parser, DeserializationContext context) if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) { _throwNoNumericTimestampNeedTimeZone(parser, context); } - throw context.wrongTokenException(parser, handledType(), JsonToken.START_ARRAY, - "Expected array or string."); + return _handleUnexpectedToken(context, parser, "Expected array or string."); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java index 1499b0f9..c3a89dc7 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java @@ -48,6 +48,6 @@ public MonthDay deserialize(JsonParser parser, DeserializationContext context) t if (parser.hasToken(JsonToken.START_ARRAY)){ return _deserializeFromArray(parser, context); } - return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT); + return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java index e92b3563..ea167324 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java @@ -73,6 +73,6 @@ public Year deserialize(JsonParser parser, DeserializationContext context) throw if (parser.hasToken(JsonToken.START_ARRAY)){ return _deserializeFromArray(parser, context); } - return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT); + return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT); } } diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java index e0a6b92c..4263e376 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java @@ -102,6 +102,6 @@ public YearMonth deserialize(JsonParser parser, DeserializationContext context) if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) { return (YearMonth) parser.getEmbeddedObject(); } - return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, JsonToken.START_ARRAY); + return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.START_ARRAY); } } diff --git a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java index 684108b1..83b0bbef 100644 --- a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java +++ b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java @@ -1,13 +1,19 @@ package com.fasterxml.jackson.datatype.jsr310; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler; import com.fasterxml.jackson.databind.exc.MismatchedInputException; import org.junit.Test; import java.io.IOException; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Month; import java.time.format.DateTimeParseException; @@ -72,6 +78,46 @@ public void testDeserializationAsEmptyArrayEnabled() throws Throwable assertNull(value); } + @Test + public void testDateTimeExceptionIsHandled() throws Throwable + { + LocalDateTime now = LocalDateTime.now(); + DeserializationProblemHandler handler = new DeserializationProblemHandler() { + @Override + public Object handleWeirdStringValue(DeserializationContext ctxt, Class targetType, + String valueToConvert, String failureMsg) throws IOException { + if (LocalDateTime.class == targetType) { + if ("now".equals(valueToConvert)) { + return now; + } + } + return NOT_HANDLED; + } + }; + ObjectMapper mapper = newMapper().addHandler(handler); + assertEquals(now, mapper.readValue(quote("now"), LocalDateTime.class)); + } + + @Test + public void testUnexpectedTokenIsHandled() throws Throwable + { + LocalDateTime now = LocalDateTime.now(); + DeserializationProblemHandler handler = new DeserializationProblemHandler() { + @Override + public Object handleUnexpectedToken(DeserializationContext ctxt, Class targetType, + JsonToken t, JsonParser p, String failureMsg) throws IOException { + if (LocalDateTime.class == targetType) { + if (t.isBoolean()) { + return now; + } + } + return NOT_HANDLED; + } + }; + ObjectMapper mapper = newMapper().addHandler(handler); + assertEquals(now, mapper.readValue("true", LocalDateTime.class)); + } + private void expectFailure(String json) throws Throwable { try { read(json); diff --git a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java index fe8efb21..9be90505 100644 --- a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java +++ b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java @@ -2,13 +2,16 @@ import static org.junit.Assert.assertEquals; +import java.io.IOException; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler; import org.junit.Before; import org.junit.Test; @@ -76,6 +79,29 @@ public void testDeserialization1() throws Exception { assertEquals("Value is incorrect", map, value); } + @Test + public void testDateTimeExceptionIsHandled() throws Throwable + { + LocalDateTime now = LocalDateTime.now(); + DeserializationProblemHandler handler = new DeserializationProblemHandler() { + @Override + public Object handleWeirdStringValue(DeserializationContext ctxt, Class targetType, + String valueToConvert, String failureMsg) throws IOException { + if (LocalDateTime.class == targetType) { + if ("now".equals(valueToConvert)) { + return now; + } + } + return NOT_HANDLED; + } + }; + Map value = om.addHandler(handler).readValue( + map("now", "test"), + TYPE_REF); + map.put(now, "test"); + assertEquals(map, value); + } + private String map(String key, String value) { return String.format("{\"%s\":\"%s\"}", key, value); } From c051ce1e3f8f231d66f255e9d86b4bb91791b193 Mon Sep 17 00:00:00 2001 From: Semen Levin Date: Wed, 4 Apr 2018 15:25:50 +0300 Subject: [PATCH 3/3] code formatting --- .../datatype/jsr310/TestLocalDateTimeDeserialization.java | 4 ++-- .../datatype/jsr310/TestLocalDateTimeKeySerialization.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java index 83b0bbef..f2d2ff1a 100644 --- a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java +++ b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java @@ -85,7 +85,7 @@ public void testDateTimeExceptionIsHandled() throws Throwable DeserializationProblemHandler handler = new DeserializationProblemHandler() { @Override public Object handleWeirdStringValue(DeserializationContext ctxt, Class targetType, - String valueToConvert, String failureMsg) throws IOException { + String valueToConvert, String failureMsg) throws IOException { if (LocalDateTime.class == targetType) { if ("now".equals(valueToConvert)) { return now; @@ -105,7 +105,7 @@ public void testUnexpectedTokenIsHandled() throws Throwable DeserializationProblemHandler handler = new DeserializationProblemHandler() { @Override public Object handleUnexpectedToken(DeserializationContext ctxt, Class targetType, - JsonToken t, JsonParser p, String failureMsg) throws IOException { + JsonToken t, JsonParser p, String failureMsg) throws IOException { if (LocalDateTime.class == targetType) { if (t.isBoolean()) { return now; diff --git a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java index 9be90505..497d31ef 100644 --- a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java +++ b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java @@ -86,7 +86,7 @@ public void testDateTimeExceptionIsHandled() throws Throwable DeserializationProblemHandler handler = new DeserializationProblemHandler() { @Override public Object handleWeirdStringValue(DeserializationContext ctxt, Class targetType, - String valueToConvert, String failureMsg) throws IOException { + String valueToConvert, String failureMsg) throws IOException { if (LocalDateTime.class == targetType) { if ("now".equals(valueToConvert)) { return now;