Skip to content

Commit ca79027

Browse files
angelyancowtowncoder
authored andcommitted
Fail deserialization into LocalDateTime of datetime with timezone (#192)
1 parent ce77a34 commit ca79027

File tree

3 files changed

+31
-24
lines changed

3 files changed

+31
-24
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@
1818

1919
import java.io.IOException;
2020
import java.time.DateTimeException;
21-
import java.time.Instant;
2221
import java.time.LocalDateTime;
23-
import java.time.ZoneOffset;
2422
import java.time.format.DateTimeFormatter;
2523

2624
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -29,6 +27,8 @@
2927
import com.fasterxml.jackson.core.JsonTokenId;
3028
import com.fasterxml.jackson.databind.DeserializationContext;
3129
import com.fasterxml.jackson.databind.DeserializationFeature;
30+
import com.fasterxml.jackson.databind.JavaType;
31+
import com.fasterxml.jackson.databind.util.ClassUtil;
3232

3333
/**
3434
* Deserializer for Java 8 temporal {@link LocalDateTime}s.
@@ -152,17 +152,22 @@ protected LocalDateTime _fromString(JsonParser p, DeserializationContext ctxt,
152152
return null;
153153
}
154154
try {
155+
// 21-Oct-2020, tatu: Removed as per [modules-base#94];
156+
// original flawed change from [modules-base#56]
155157
if (_formatter == DEFAULT_FORMATTER) {
156158
// JavaScript by default includes time and zone in JSON serialized Dates (UTC/ISO instant format).
157159
if (string.length() > 10 && string.charAt(10) == 'T') {
158160
if (string.endsWith("Z")) {
159-
return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC);
160-
} else {
161-
return LocalDateTime.parse(string, DEFAULT_FORMATTER);
161+
JavaType t = getValueType(ctxt);
162+
ctxt.reportInputMismatch(t,
163+
"Invalid value ('%s') for %s: should not contain timezone/offset (define custom `@JsonFormat(pattern=)` if you must accept)",
164+
string, ClassUtil.getTypeDescription(t));
162165
}
166+
// return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC);
167+
// } else {
168+
// return LocalDateTime.parse(string, DEFAULT_FORMATTER);
163169
}
164170
}
165-
166171
return LocalDateTime.parse(string, _formatter);
167172
} catch (DateTimeException e) {
168173
return _handleDateTimeException(ctxt, e, string);

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/ModuleTestBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protected static JsonMapper.Builder mapperBuilder() {
3636
return JsonMapper.builder()
3737
.addModule(new JavaTimeModule());
3838
}
39-
39+
4040
protected String quote(String value) {
4141
return "\"" + value + "\"";
4242
}

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

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.deser;
1818

19+
import java.io.IOException;
20+
import java.time.LocalDateTime;
21+
import java.time.Month;
22+
import java.time.format.DateTimeParseException;
23+
import java.time.temporal.Temporal;
24+
import java.util.Calendar;
25+
import java.util.Date;
26+
import java.util.Map;
27+
import java.util.TimeZone;
28+
1929
import com.fasterxml.jackson.annotation.JsonFormat;
2030
import com.fasterxml.jackson.annotation.JsonFormat.Feature;
2131
import com.fasterxml.jackson.annotation.JsonFormat.Value;
@@ -32,18 +42,6 @@
3242
import com.fasterxml.jackson.datatype.jsr310.ModuleTestBase;
3343
import org.junit.Test;
3444

35-
import java.io.IOException;
36-
import java.time.Instant;
37-
import java.time.LocalDateTime;
38-
import java.time.Month;
39-
import java.time.ZoneOffset;
40-
import java.time.format.DateTimeParseException;
41-
import java.time.temporal.Temporal;
42-
import java.util.Calendar;
43-
import java.util.Date;
44-
import java.util.Map;
45-
import java.util.TimeZone;
46-
4745
import static org.junit.Assert.*;
4846

4947
public class LocalDateTimeDeserTest
@@ -169,12 +167,17 @@ public void testDeserializationAsString03() throws Exception
169167
assertEquals("The value is not correct.", time, value);
170168
}
171169

170+
// [modules-java#94]: Should not include timezone
172171
@Test
173-
public void testDeserializationAsString04() throws Exception
172+
public void testBadDeserializationOfTimeWithTimeZone() throws Exception
174173
{
175-
Instant instant = Instant.now();
176-
LocalDateTime value = MAPPER.readValue('"' + instant.toString() + '"', LocalDateTime.class);
177-
assertEquals("The value is not correct.", LocalDateTime.ofInstant(instant, ZoneOffset.UTC), value);
174+
try {
175+
MAPPER.readValue(quote("2020-10-22T00:16:20.504Z"), LocalDateTime.class);
176+
fail("expected fail");
177+
} catch (InvalidFormatException e) {
178+
verifyException(e, "Cannot deserialize value of type");
179+
verifyException(e, "from String \"");
180+
}
178181
}
179182

180183
@Test
@@ -493,7 +496,6 @@ public void testStrictCustomFormatInvalidDateAndTime() throws Exception
493496
/*StrictWrapper w =*/ MAPPER.readValue("{\"value\":\"2019-11-31 25:45\"}", StrictWrapper.class);
494497
}
495498

496-
497499
private void expectSuccess(ObjectReader reader, Object exp, String json) throws IOException {
498500
final LocalDateTime value = reader.readValue(aposToQuotes(json));
499501
assertNotNull("The value should not be null.", value);

0 commit comments

Comments
 (0)