Skip to content

Commit 961c128

Browse files
authored
[Jackson3.0] Fix #4845: change SerializationFeature.WRITE_DATES_AS_TIMESTAMPS to false in 3.0 (#4946)
1 parent 58b72d1 commit 961c128

File tree

10 files changed

+34
-17
lines changed

10 files changed

+34
-17
lines changed

release-notes/VERSION

+2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ Versions: 3.x (for earlier see VERSION-2.x)
8787
#4820: Change JDK baseline for Jackson 3.0 from Java 8 to Java 17
8888
#4835: Remove dynamic work-arounds wrt accessing `Record` definition
8989
#4840: Increase minimum Android SDK required to 34 for Jackson 3.0
90+
#4845: Change default of `SerializationFeature.WRITE_DATES_AS_TIMESTAMPS`
91+
to `false` in 3.0
9092
#4846: Change default of `SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS`
9193
to `false` in 3.0
9294
#4858: Change default of `DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES`

src/main/java/tools/jackson/databind/SerializationFeature.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,10 @@ public enum SerializationFeature implements ConfigFeature
193193
* or not is controlled using {@link #WRITE_DATE_KEYS_AS_TIMESTAMPS} instead of
194194
* this feature.
195195
*<p>
196-
* Feature is enabled by default, so that date/time are by default
197-
* serialized as time stamps.
196+
* Feature is disabled by default as of Jackson 3.0 (in 2.x it was enabled),
197+
* so that date/time are by default serialized as textual values NOT timestamps.
198198
*/
199-
WRITE_DATES_AS_TIMESTAMPS(true),
199+
WRITE_DATES_AS_TIMESTAMPS(false),
200200

201201
/**
202202
* Feature that determines whether {@link java.util.Date}s

src/test/java/tools/jackson/databind/ext/sql/SqlDateSerializationTest.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ static class Person {
4444
@Test
4545
public void testSqlDate() throws Exception
4646
{
47+
ObjectWriter writer = MAPPER.writer()
48+
.with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
4749
// use date 1999-04-01 (note: months are 0-based, use constant)
4850
final java.sql.Date date99 = javaSqlDate(1999, Calendar.APRIL, 1);
4951
final java.sql.Date date0 = new java.sql.Date(0);
@@ -52,14 +54,14 @@ public void testSqlDate() throws Exception
5254
// defaults in 2.9, even if this changes behavior.
5355

5456
assertEquals(String.valueOf(date99.getTime()),
55-
MAPPER.writeValueAsString(date99));
57+
writer.writeValueAsString(date99));
5658

5759
assertEquals(a2q("{'date':0}"),
58-
MAPPER.writeValueAsString(new SqlDateAsDefaultBean(0L)));
60+
writer.writeValueAsString(new SqlDateAsDefaultBean(0L)));
5961

6062
// but may explicitly force timestamp too
6163
assertEquals(a2q("{'date':0}"),
62-
MAPPER.writeValueAsString(new SqlDateAsNumberBean(0L)));
64+
writer.writeValueAsString(new SqlDateAsNumberBean(0L)));
6365

6466
// And also should be able to use String output as need be:
6567
ObjectWriter w = MAPPER.writer().without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

src/test/java/tools/jackson/databind/ext/xml/MiscJavaXMLTypesReadWriteTest.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,17 @@ public void testDurationSer() throws Exception
5454
@Test
5555
public void testXMLGregorianCalendarSerAndDeser() throws Exception
5656
{
57+
ObjectMapper withMapper = jsonMapperBuilder().enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
5758
DatatypeFactory dtf = DatatypeFactory.newInstance();
5859
XMLGregorianCalendar cal = dtf.newXMLGregorianCalendar
5960
(1974, 10, 10, 18, 15, 17, 123, 0);
6061

6162
long timestamp = cal.toGregorianCalendar().getTimeInMillis();
6263
String numStr = String.valueOf(timestamp);
63-
assertEquals(numStr, MAPPER.writeValueAsString(cal));
64+
assertEquals(numStr, withMapper.writeValueAsString(cal));
6465

6566
// [JACKSON-403] Needs to come back ok as well:
66-
XMLGregorianCalendar calOut = MAPPER.readValue(numStr, XMLGregorianCalendar.class);
67+
XMLGregorianCalendar calOut = withMapper.readValue(numStr, XMLGregorianCalendar.class);
6768
assertNotNull(calOut);
6869
assertEquals(timestamp, calOut.toGregorianCalendar().getTimeInMillis());
6970

src/test/java/tools/jackson/databind/jsontype/TestPolymorphicDeserialization676.java

+2
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ public TestPolymorphicDeserialization676() {
8686
public void testDeSerFail() throws IOException {
8787
final ObjectMapper mapper = jsonMapperBuilder()
8888
.polymorphicTypeValidator(new NoCheckSubTypeValidator())
89+
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
8990
.build();
9091

9192
MapContainer deserMapBad = createDeSerMapContainer(originMap, mapper);
@@ -99,6 +100,7 @@ public void testDeSerCorrect() throws IOException {
99100
final ObjectMapper mapper = jsonMapperBuilder()
100101
.polymorphicTypeValidator(new NoCheckSubTypeValidator())
101102
.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS)
103+
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
102104
.build();
103105
Map<String, Object> map = new HashMap<String, Object>();
104106
map.put("1", 1);

src/test/java/tools/jackson/databind/jsontype/deftyping/TestDefaultForScalars.java

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public ObjectWrapperForPoly(final Object o) {
5050

5151
private final ObjectMapper DEFAULT_TYPING_MAPPER = jsonMapperBuilder()
5252
.activateDefaultTyping(NoCheckSubTypeValidator.instance)
53+
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
5354
.build();
5455

5556
/**
@@ -105,6 +106,7 @@ public void testScalarArrays() throws Exception
105106
ObjectMapper mapper = jsonMapperBuilder()
106107
.activateDefaultTyping(NoCheckSubTypeValidator.instance,
107108
DefaultTyping.JAVA_LANG_OBJECT)
109+
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
108110
.build();
109111
Object[] input = new Object[] {
110112
"abc", new Date(1234567), null, Integer.valueOf(456)

src/test/java/tools/jackson/databind/jsontype/ext/ExternalTypeIdTest.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -493,13 +493,16 @@ public void testWithNaturalScalar118() throws Exception
493493
@Test
494494
public void testWithAsValue() throws Exception
495495
{
496+
ObjectMapper mapper = jsonMapperBuilder()
497+
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
498+
.build();
496499
ExternalTypeWithNonPOJO input = new ExternalTypeWithNonPOJO(new AsValueThingy(12345L));
497-
String json = MAPPER.writeValueAsString(input);
500+
String json = mapper.writeValueAsString(input);
498501
assertNotNull(json);
499502
assertEquals("{\"value\":12345,\"type\":\"thingy\"}", json);
500503

501504
// and get it back too:
502-
ExternalTypeWithNonPOJO result = MAPPER.readValue(json, ExternalTypeWithNonPOJO.class);
505+
ExternalTypeWithNonPOJO result = mapper.readValue(json, ExternalTypeWithNonPOJO.class);
503506
assertNotNull(result);
504507
assertNotNull(result.value);
505508
assertEquals(AsValueThingy.class, result.value.getClass());

src/test/java/tools/jackson/databind/ser/SerializationConfigTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void testDefaults()
8080
assertTrue(cfg.isEnabled(MapperFeature.USE_ANNOTATIONS));
8181
assertTrue(cfg.isEnabled(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS));
8282

83-
assertTrue(cfg.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS));
83+
assertFalse(cfg.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS));
8484

8585
assertEquals(MapperFeature.DEFAULT_VIEW_INCLUSION.enabledByDefault(),
8686
cfg.isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION));

src/test/java/tools/jackson/databind/ser/filter/JsonIncludeTest.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -392,11 +392,13 @@ public void testSerialization4741() throws Exception
392392
@Test
393393
public void testInclusionOfDate() throws Exception
394394
{
395+
ObjectWriter writerWith = MAPPER.writer().with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
396+
395397
final Date input = new Date(0L);
396398
assertEquals(a2q("{'value':0}"),
397-
MAPPER.writeValueAsString(new NonEmptyDate(input)));
399+
writerWith.writeValueAsString(new NonEmptyDate(input)));
398400
assertEquals("{}",
399-
MAPPER.writeValueAsString(new NonDefaultDate(input)));
401+
writerWith.writeValueAsString(new NonDefaultDate(input)));
400402

401403

402404
}
@@ -405,11 +407,13 @@ public void testInclusionOfDate() throws Exception
405407
@Test
406408
public void testInclusionOfCalendar() throws Exception
407409
{
410+
ObjectWriter writerWith = MAPPER.writer().with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
411+
408412
final Calendar input = new GregorianCalendar();
409413
input.setTimeInMillis(0L);
410414
assertEquals(a2q("{'value':0}"),
411-
MAPPER.writeValueAsString(new NonEmptyCalendar(input)));
415+
writerWith.writeValueAsString(new NonEmptyCalendar(input)));
412416
assertEquals("{}",
413-
MAPPER.writeValueAsString(new NonDefaultCalendar(input)));
417+
writerWith.writeValueAsString(new NonDefaultCalendar(input)));
414418
}
415419
}

src/test/java/tools/jackson/databind/ser/jdk/JavaUtilDateSerializationTest.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,10 @@ static class DateAsDefaultBeanWithTimezone {
103103
public void testDateNumeric() throws IOException
104104
{
105105
// default is to output time stamps...
106-
assertTrue(MAPPER.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS));
106+
assertFalse(MAPPER.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS));
107107
// shouldn't matter which offset we give...
108-
String json = MAPPER.writeValueAsString(new Date(199L));
108+
String json = MAPPER.writer().with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
109+
.writeValueAsString(new Date(199L));
109110
assertEquals("199", json);
110111
}
111112

0 commit comments

Comments
 (0)