Skip to content

Commit 1df72c0

Browse files
committed
Improve error reporting wrt #47
1 parent b9991b2 commit 1df72c0

File tree

7 files changed

+55
-0
lines changed

7 files changed

+55
-0
lines changed

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DateTimeDeserializerBase.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.fasterxml.jackson.datatype.jsr310.deser;
22

3+
import java.io.IOException;
34
import java.time.format.DateTimeFormatter;
45
import java.util.Locale;
56

67
import com.fasterxml.jackson.annotation.JsonFormat;
8+
import com.fasterxml.jackson.core.JsonParser;
79
import com.fasterxml.jackson.databind.BeanProperty;
810
import com.fasterxml.jackson.databind.DeserializationContext;
911
import com.fasterxml.jackson.databind.JsonDeserializer;
@@ -51,4 +53,12 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
5153
}
5254
return this;
5355
}
56+
57+
protected void _throwNoNumericTimestampNeedTimeZone(JsonParser p, DeserializationContext ctxt)
58+
throws IOException
59+
{
60+
ctxt.reportInputMismatch(handledType(),
61+
"raw timestamp (%d) not allowed for `%s`: need additional information such as an offset or time-zone (see class Javadocs)",
62+
p.getNumberValue(), handledType().getName());
63+
}
5464
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public LocalDate deserialize(JsonParser parser, DeserializationContext context)
114114
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) {
115115
return (LocalDate) parser.getEmbeddedObject();
116116
}
117+
// 06-Jan-2018, tatu: Is this actually safe? Do users expect such coercion?
117118
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
118119
return LocalDate.ofEpochDay(parser.getLongValue());
119120
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ public LocalDateTime deserialize(JsonParser parser, DeserializationContext conte
135135
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) {
136136
return (LocalDateTime) parser.getEmbeddedObject();
137137
}
138+
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
139+
_throwNoNumericTimestampNeedTimeZone(parser, context);
140+
}
138141
throw context.wrongTokenException(parser, handledType(), JsonToken.VALUE_STRING,
139142
"Expected array or string.");
140143
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ public LocalTime deserialize(JsonParser parser, DeserializationContext context)
124124
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) {
125125
return (LocalTime) parser.getEmbeddedObject();
126126
}
127+
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
128+
_throwNoNumericTimestampNeedTimeZone(parser, context);
129+
}
127130
throw context.wrongTokenException(parser, handledType(), JsonToken.START_ARRAY,
128131
"Expected array or string.");
129132
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/OffsetTimeDeserializer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public OffsetTime deserialize(JsonParser parser, DeserializationContext context)
6767
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) {
6868
return (OffsetTime) parser.getEmbeddedObject();
6969
}
70+
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
71+
_throwNoNumericTimestampNeedTimeZone(parser, context);
72+
}
7073
throw context.wrongTokenException(parser, handledType(), JsonToken.START_ARRAY,
7174
"Expected array or string.");
7275
}

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.fasterxml.jackson.databind.ObjectMapper;
3030
import com.fasterxml.jackson.databind.ObjectReader;
3131
import com.fasterxml.jackson.databind.SerializationFeature;
32+
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
3233
import com.fasterxml.jackson.datatype.jsr310.MockObjectConfiguration;
3334
import com.fasterxml.jackson.datatype.jsr310.ModuleTestBase;
3435

@@ -41,6 +42,12 @@ public class LocalDateTimeDeserTest
4142
{
4243
private final ObjectMapper mapper = newMapper();
4344

45+
/*
46+
/**********************************************************
47+
/* Tests for deserializing from int array
48+
/**********************************************************
49+
*/
50+
4451
@Test
4552
public void testDeserializationAsTimestamp01() throws Exception
4653
{
@@ -108,6 +115,12 @@ public void testDeserializationAsTimestamp04Milliseconds02() throws Exception
108115
assertEquals("The value is not correct.", time, value);
109116
}
110117

118+
/*
119+
/**********************************************************
120+
/* Tests for deserializing from textual representation
121+
/**********************************************************
122+
*/
123+
111124
@Test
112125
public void testDeserializationAsString01() throws Exception
113126
{
@@ -140,6 +153,12 @@ public void testDeserializationAsString04() throws Exception
140153
assertEquals("The value is not correct.", LocalDateTime.ofInstant(instant, ZoneOffset.UTC), value);
141154
}
142155

156+
/*
157+
/**********************************************************
158+
/* Tests for polymorphic handling
159+
/**********************************************************
160+
*/
161+
143162
@Test
144163
public void testDeserializationWithTypeInfo01() throws Exception
145164
{
@@ -204,4 +223,18 @@ public void testDeserializeToDate() throws Exception
204223
assertEquals(45, cal.get(Calendar.MINUTE));
205224
assertEquals(5, cal.get(Calendar.SECOND));
206225
}
226+
227+
// [modules-java8#47]: should indicate why timestamp won't work
228+
@Test
229+
public void testDeserilizeFromSimpleTimestamp() throws Exception
230+
{
231+
ObjectReader r = mapper.readerFor(LocalDateTime.class);
232+
LocalDateTime value;
233+
try {
234+
value = r.readValue("1235");
235+
fail("Should not succeed, instead got: "+value);
236+
} catch (MismatchedInputException e) {
237+
verifyException(e, "raw timestamp (1235) not allowed for `java.time.LocalDateTime`");
238+
}
239+
}
207240
}

release-notes/VERSION

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Modules:
1313
#46: Double array serialization of `LocalDate` stored as an object with
1414
wrapper object typing enabled
1515
(reported by unintended@github)
16+
- Improve error reporting for `LocalDateTime`, `LocalTime`, `OffsetTime` for
17+
timestamp input (JSON integer value)
1618

1719
2.9.2 (14-Oct-2017)
1820
2.9.1 (07-Sep-2017)

0 commit comments

Comments
 (0)