From 275e054ec3f479d1aec979f008816344329a6278 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 12 Sep 2018 21:35:21 -0700 Subject: [PATCH] Fix #75 --- datatypes/pom.xml | 2 +- datetime/pom.xml | 2 +- .../datatype/jsr310/JavaTimeModule.java | 14 +++++++------ .../jsr310/ser/DurationSerializer.java | 15 +++++++++++++- .../ser/JSR310FormattedSerializerBase.java | 16 ++++++++++++++- .../jsr310/TestDurationSerialization.java | 20 +++++++++---------- .../TestLocalDateTimeDeserialization.java | 1 - .../jsr310/old/TestDurationSerialization.java | 20 +++++++++---------- parameter-names/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 62 insertions(+), 34 deletions(-) diff --git a/datatypes/pom.xml b/datatypes/pom.xml index ac8f5a20..cbc29351 100644 --- a/datatypes/pom.xml +++ b/datatypes/pom.xml @@ -4,7 +4,7 @@ com.fasterxml.jackson.module jackson-modules-java8 - 2.9.7-SNAPSHOT + 2.10.0-SNAPSHOT com.fasterxml.jackson.datatype jackson-datatype-jdk8 diff --git a/datetime/pom.xml b/datetime/pom.xml index efafacf8..c2efe142 100644 --- a/datetime/pom.xml +++ b/datetime/pom.xml @@ -4,7 +4,7 @@ com.fasterxml.jackson.module jackson-modules-java8 - 2.9.7-SNAPSHOT + 2.10.0-SNAPSHOT com.fasterxml.jackson.datatype jackson-datatype-jsr310 diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java index 496c89d9..839b4b48 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java @@ -88,15 +88,18 @@ * *

* Note that as of 2.x, if auto-registering modules, this package will register - * legacy version, {@link JSR310Module}, and NOT this module. 3.x will change the efaults. + * legacy version, {@link JSR310Module}, and NOT this module. 3.x will change the default. * Legacy version has the same functionality, but slightly different default configuration: * see {@link com.fasterxml.jackson.datatype.jsr310.JSR310Module} for details. *

* Most {@code java.time} types are serialized as numbers (integers or decimals as appropriate) if the - * {@link com.fasterxml.jackson.databind.SerializationFeature#WRITE_DATES_AS_TIMESTAMPS} feature is enabled, and otherwise are serialized in - * standard ISO-8601 string representation. ISO-8601 specifies formats - * for representing offset dates and times, zoned dates and times, local dates and times, periods, durations, zones, and more. All - * {@code java.time} types have built-in translation to and from ISO-8601 formats. + * {@link com.fasterxml.jackson.databind.SerializationFeature#WRITE_DATES_AS_TIMESTAMPS} feature is enabled + * (or, for {@link Duration}, {@link com.fasterxml.jackson.databind.SerializationFeature#WRITE_DURATIONS_AS_TIMESTAMPS}), + * and otherwise are serialized in standard + * ISO-8601 string representation. + * ISO-8601 specifies formats for representing offset dates and times, zoned dates and times, + * local dates and times, periods, durations, zones, and more. All {@code java.time} types + * have built-in translation to and from ISO-8601 formats. *

* Granularity of timestamps is controlled through the companion features * {@link com.fasterxml.jackson.databind.SerializationFeature#WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS} and @@ -155,7 +158,6 @@ public JavaTimeModule() addDeserializer(ZoneId.class, JSR310StringParsableDeserializer.ZONE_ID); addDeserializer(ZoneOffset.class, JSR310StringParsableDeserializer.ZONE_OFFSET); - // then serializers: addSerializer(Duration.class, DurationSerializer.INSTANCE); addSerializer(Instant.class, InstantSerializer.INSTANCE); diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/DurationSerializer.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/DurationSerializer.java index 1f26f97d..3f77751b 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/DurationSerializer.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/DurationSerializer.java @@ -20,8 +20,10 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; + import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonIntegerFormatVisitor; @@ -34,6 +36,11 @@ /** * Serializer for Java 8 temporal {@link Duration}s. + *

+ * NOTE: since 2.10, {@link SerializationFeature#WRITE_DURATIONS_AS_TIMESTAMPS} + * determines global default used for determining if serialization should use + * numeric (timestamps) or textual representation. Before this, + * {@link SerializationFeature#WRITE_DATES_AS_TIMESTAMPS} was used. * * @author Nick Williams * @since 2.2 @@ -62,7 +69,13 @@ protected DurationSerializer(DurationSerializer base, protected DurationSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) { return new DurationSerializer(this, useTimestamp, dtf); } - + + // @since 2.10 + @Override + protected SerializationFeature getTimestampsFeature() { + return SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS; + } + @Override public void serialize(Duration duration, JsonGenerator generator, SerializerProvider provider) throws IOException { diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/JSR310FormattedSerializerBase.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/JSR310FormattedSerializerBase.java index 13c6c076..c88994dd 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/JSR310FormattedSerializerBase.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/JSR310FormattedSerializerBase.java @@ -194,6 +194,20 @@ protected void _acceptTimestampVisitor(JsonFormatVisitorWrapper visitor, JavaTyp } } + /** + * Overridable method that determines {@link SerializationFeature} that is used as + * the global default in determining if date/time value serialized should use numeric + * format ("timestamp") or not. + *

+ * Note that this feature is just the baseline setting and may be overridden on per-type + * or per-property basis. + * + * @since 2.10 + */ + protected SerializationFeature getTimestampsFeature() { + return SerializationFeature.WRITE_DATES_AS_TIMESTAMPS; + } + protected boolean useTimestamp(SerializerProvider provider) { if (_useTimestamp != null) { return _useTimestamp.booleanValue(); @@ -207,7 +221,7 @@ protected boolean useTimestamp(SerializerProvider provider) { } } // assume that explicit formatter definition implies use of textual format - return _formatter == null && provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + return (_formatter == null) && provider.isEnabled(getTimestampsFeature()); } protected boolean _useTimestampExplicitOnly(SerializerProvider provider) { diff --git a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestDurationSerialization.java b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestDurationSerialization.java index 796683f5..52127548 100644 --- a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestDurationSerialization.java +++ b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestDurationSerialization.java @@ -27,7 +27,7 @@ public void testSerializationAsTimestampNanoseconds01() throws Exception { Duration duration = Duration.ofSeconds(60L, 0); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .with(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -40,7 +40,7 @@ public void testSerializationAsTimestampNanoseconds02() throws Exception { Duration duration = Duration.ofSeconds(13498L, 8374); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .with(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -53,7 +53,7 @@ public void testSerializationAsTimestampMilliseconds01() throws Exception { Duration duration = Duration.ofSeconds(60L, 0); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .without(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -66,7 +66,7 @@ public void testSerializationAsTimestampMilliseconds02() throws Exception { Duration duration = Duration.ofSeconds(13498L, 8374); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .without(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -79,7 +79,7 @@ public void testSerializationAsTimestampMilliseconds03() throws Exception { Duration duration = Duration.ofSeconds(13498L, 837481723); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .without(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -92,7 +92,7 @@ public void testSerializationAsString01() throws Exception { Duration duration = Duration.ofSeconds(60L, 0); String value = WRITER - .without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .without(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .writeValueAsString(duration); assertNotNull("The value should not be null.", value); @@ -104,7 +104,7 @@ public void testSerializationAsString02() throws Exception { Duration duration = Duration.ofSeconds(13498L, 8374); String value = WRITER - .without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .without(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .writeValueAsString(duration); assertNotNull("The value should not be null.", value); @@ -115,7 +115,7 @@ public void testSerializationAsString02() throws Exception public void testSerializationWithTypeInfo01() throws Exception { ObjectMapper mapper = newMapper(); // need new to add mix-ins: - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, true); mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, true); mapper.addMixIn(TemporalAmount.class, MockObjectConfiguration.class); Duration duration = Duration.ofSeconds(13498L, 8374); @@ -130,7 +130,7 @@ public void testSerializationWithTypeInfo01() throws Exception public void testSerializationWithTypeInfo02() throws Exception { ObjectMapper mapper = newMapper(); // need new to add mix-ins: - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, true); mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false); mapper.addMixIn(TemporalAmount.class, MockObjectConfiguration.class); Duration duration = Duration.ofSeconds(13498L, 837481723); @@ -145,7 +145,7 @@ public void testSerializationWithTypeInfo02() throws Exception public void testSerializationWithTypeInfo03() throws Exception { ObjectMapper mapper = newMapper(); // need new to add mix-ins: - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false); mapper.addMixIn(TemporalAmount.class, MockObjectConfiguration.class); Duration duration = Duration.ofSeconds(13498L, 8374); String value = mapper.writeValueAsString(duration); 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 f2d2ff1a..57d4f9cb 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 @@ -13,7 +13,6 @@ 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; diff --git a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/old/TestDurationSerialization.java b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/old/TestDurationSerialization.java index fd896ae1..19c79227 100644 --- a/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/old/TestDurationSerialization.java +++ b/datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/old/TestDurationSerialization.java @@ -27,7 +27,7 @@ public void testSerializationAsTimestampNanoseconds01() throws Exception { Duration duration = Duration.ofSeconds(60L, 0); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .with(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -41,7 +41,7 @@ public void testSerializationAsTimestampNanoseconds02() throws Exception { Duration duration = Duration.ofSeconds(13498L, 8374); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .with(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -54,7 +54,7 @@ public void testSerializationAsTimestampMilliseconds01() throws Exception { Duration duration = Duration.ofSeconds(60L, 0); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .without(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -67,7 +67,7 @@ public void testSerializationAsTimestampMilliseconds02() throws Exception { Duration duration = Duration.ofSeconds(13498L, 8374); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .without(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -80,7 +80,7 @@ public void testSerializationAsTimestampMilliseconds03() throws Exception { Duration duration = Duration.ofSeconds(13498L, 837481723); String value = WRITER - .with(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .with(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .without(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS) .writeValueAsString(duration); @@ -93,7 +93,7 @@ public void testSerializationAsString01() throws Exception { Duration duration = Duration.ofSeconds(60L, 0); String value = WRITER - .without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .without(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .writeValueAsString(duration); assertNotNull("The value should not be null.", value); @@ -105,7 +105,7 @@ public void testSerializationAsString02() throws Exception { Duration duration = Duration.ofSeconds(13498L, 8374); String value = WRITER - .without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .without(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS) .writeValueAsString(duration); assertNotNull("The value should not be null.", value); @@ -116,7 +116,7 @@ public void testSerializationAsString02() throws Exception public void testSerializationWithTypeInfo01() throws Exception { ObjectMapper mapper = newMapper(); // need new to add mix-ins: - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, true); mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, true); mapper.addMixIn(TemporalAmount.class, MockObjectConfiguration.class); Duration duration = Duration.ofSeconds(13498L, 8374); @@ -131,7 +131,7 @@ public void testSerializationWithTypeInfo01() throws Exception public void testSerializationWithTypeInfo02() throws Exception { ObjectMapper mapper = newMapper(); // need new to add mix-ins: - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, true); mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false); mapper.addMixIn(TemporalAmount.class, MockObjectConfiguration.class); Duration duration = Duration.ofSeconds(13498L, 837481723); @@ -146,7 +146,7 @@ public void testSerializationWithTypeInfo02() throws Exception public void testSerializationWithTypeInfo03() throws Exception { ObjectMapper mapper = newMapper(); // need new to add mix-ins: - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false); mapper.addMixIn(TemporalAmount.class, MockObjectConfiguration.class); Duration duration = Duration.ofSeconds(13498L, 8374); String value = mapper.writeValueAsString(duration); diff --git a/parameter-names/pom.xml b/parameter-names/pom.xml index e4c35fc0..db103e5d 100644 --- a/parameter-names/pom.xml +++ b/parameter-names/pom.xml @@ -4,7 +4,7 @@ com.fasterxml.jackson.module jackson-modules-java8 - 2.9.7-SNAPSHOT + 2.10.0-SNAPSHOT jackson-module-parameter-names Jackson-module-parameter-names diff --git a/pom.xml b/pom.xml index 4c18590b..06dbae84 100644 --- a/pom.xml +++ b/pom.xml @@ -3,12 +3,12 @@ com.fasterxml.jackson jackson-base - 2.9.6 + 2.10.0-SNAPSHOT com.fasterxml.jackson.module jackson-modules-java8 Jackson modules: Java 8 - 2.9.7-SNAPSHOT + 2.10.0-SNAPSHOT pom Parent pom for Jackson modules needed to support Java 8 features and types