From b1e9139efeba9161493cfb7840f78a81db3d555b Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 15 Jul 2015 14:34:58 +0100 Subject: [PATCH] =?UTF-8?q?Allow=20Jackson=E2=80=99s=20time=20zone=20to=20?= =?UTF-8?q?be=20configured=20via=20the=20environment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds a new property, spring.jackson.time-zone, that can be used to configure the time zone that Jackson uses when configuring dates. It affects the serialisation of both JDK and Joda date types. Closes gh-3505 --- .../jackson/JacksonAutoConfiguration.java | 3 ++ .../jackson/JacksonProperties.java | 14 ++++++++++ .../JacksonAutoConfigurationTests.java | 28 +++++++++++++++++++ .../appendix-application-properties.adoc | 1 + 4 files changed, 46 insertions(+) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java index 899d8ec644..894e59fae5 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java @@ -151,6 +151,9 @@ public class JacksonAutoConfiguration { builder.serializationInclusion(this.jacksonProperties .getSerializationInclusion()); } + if (this.jacksonProperties.getTimeZone() != null) { + builder.timeZone(this.jacksonProperties.getTimeZone()); + } configureFeatures(builder, this.jacksonProperties.getDeserialization()); configureFeatures(builder, this.jacksonProperties.getSerialization()); configureFeatures(builder, this.jacksonProperties.getMapper()); diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java index a490a62e41..483d3c74ee 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java @@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.jackson; import java.util.HashMap; import java.util.Map; +import java.util.TimeZone; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -88,6 +89,12 @@ public class JacksonProperties { */ private JsonInclude.Include serializationInclusion; + /** + * Time zone used when formatting dates. Configured using any recognized time zone + * identifier, for example "America/Los_Angeles" or "GMT+10". + */ + private TimeZone timeZone = null; + public String getDateFormat() { return this.dateFormat; } @@ -140,4 +147,11 @@ public class JacksonProperties { this.serializationInclusion = serializationInclusion; } + public TimeZone getTimeZone() { + return this.timeZone; + } + + public void setTimeZone(TimeZone timeZone) { + this.timeZone = timeZone; + } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java index 4b4ff7e953..186d5e3e11 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java @@ -374,6 +374,34 @@ public class JacksonAutoConfigurationTests { is(JsonInclude.Include.NON_NULL)); } + @Test + public void customTimeZoneFormattingADateTime() throws JsonProcessingException { + this.context.register(JacksonAutoConfiguration.class); + EnvironmentTestUtils.addEnvironment(this.context, + "spring.jackson.time-zone:America/Los_Angeles"); + EnvironmentTestUtils.addEnvironment(this.context, + "spring.jackson.date-format:zzzz"); + this.context.refresh(); + ObjectMapper objectMapper = this.context.getBean( + Jackson2ObjectMapperBuilder.class).build(); + DateTime dateTime = new DateTime(1436966242231L, DateTimeZone.UTC); + assertEquals("\"Pacific Daylight Time\"", + objectMapper.writeValueAsString(dateTime)); + } + + @Test + public void customTimeZoneFormattingADate() throws JsonProcessingException { + this.context.register(JacksonAutoConfiguration.class); + EnvironmentTestUtils.addEnvironment(this.context, + "spring.jackson.time-zone:GMT+10"); + EnvironmentTestUtils.addEnvironment(this.context, "spring.jackson.date-format:z"); + this.context.refresh(); + ObjectMapper objectMapper = this.context.getBean( + Jackson2ObjectMapperBuilder.class).build(); + Date date = new Date(1436966242231L); + assertEquals("\"GMT+10:00\"", objectMapper.writeValueAsString(date)); + } + @Configuration protected static class MockObjectMapperConfig { diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 91fa4c300c..cf44601ec9 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -179,6 +179,7 @@ content into your application; rather pick only the properties that you need. spring.jackson.parser.*= # see Jackson's JsonParser.Feature spring.jackson.serialization.*= # see Jackson's SerializationFeature spring.jackson.serialization-inclusion= # Controls the inclusion of properties during serialization (see Jackson's JsonInclude.Include) + spring.jackson.time-zone # Time zone used when formatting dates. Configured using any recognized time zone identifier, for example "America/Los_Angeles" or "GMT+10" # THYMELEAF ({sc-spring-boot-autoconfigure}/thymeleaf/ThymeleafAutoConfiguration.{sc-ext}[ThymeleafAutoConfiguration]) spring.thymeleaf.check-template-location=true