From 64461bb978aac4bbb9e70f0c807e2e0099d06811 Mon Sep 17 00:00:00 2001 From: Johannes Stelzer Date: Fri, 24 Jul 2015 21:36:28 +0200 Subject: [PATCH 1/2] Add locale customization of the ObjectMapper Add a new spring.jackson.locale property to customize the locale of the ObjectMapper. Closes gh-3600 --- .../jackson/JacksonAutoConfiguration.java | 8 ++++++++ .../autoconfigure/jackson/JacksonProperties.java | 13 +++++++++++++ .../jackson/JacksonAutoConfigurationTests.java | 16 ++++++++++++++++ 3 files changed, 37 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 85c6601838b..b457aa7126e 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 @@ -162,6 +162,7 @@ public class JacksonAutoConfiguration { configureDateFormat(builder); configurePropertyNamingStrategy(builder); configureModules(builder); + configureLocale(builder); return builder; } @@ -237,6 +238,13 @@ public class JacksonAutoConfiguration { builder.modulesToInstall(moduleBeans.toArray(new Module[moduleBeans.size()])); } + private void configureLocale(Jackson2ObjectMapperBuilder builder) { + String locale = this.jacksonProperties.getLocale(); + if (locale != null) { + builder.locale(locale); + } + } + private static Collection getBeans(ListableBeanFactory beanFactory, Class type) { return BeanFactoryUtils.beansOfTypeIncludingAncestors(beanFactory, type) 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 df69f33baa2..af98b099ebd 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 @@ -95,6 +95,11 @@ public class JacksonProperties { */ private TimeZone timeZone = null; + /** + * Locale used for formatting. + */ + private String locale; + public String getDateFormat() { return this.dateFormat; } @@ -155,4 +160,12 @@ public class JacksonProperties { this.timeZone = timeZone; } + public String getLocale() { + return this.locale; + } + + public void setLocale(String locale) { + this.locale = locale; + } + } 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 186d5e3e113..9f7ce9b7bff 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 @@ -381,6 +381,7 @@ public class JacksonAutoConfigurationTests { "spring.jackson.time-zone:America/Los_Angeles"); EnvironmentTestUtils.addEnvironment(this.context, "spring.jackson.date-format:zzzz"); + EnvironmentTestUtils.addEnvironment(this.context, "spring.jackson.locale:en"); this.context.refresh(); ObjectMapper objectMapper = this.context.getBean( Jackson2ObjectMapperBuilder.class).build(); @@ -402,6 +403,21 @@ public class JacksonAutoConfigurationTests { assertEquals("\"GMT+10:00\"", objectMapper.writeValueAsString(date)); } + @Test + public void customLocale() throws JsonProcessingException { + this.context.register(JacksonAutoConfiguration.class); + EnvironmentTestUtils.addEnvironment(this.context, "spring.jackson.locale:de"); + 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("\"Koordinierte Universalzeit\"", + objectMapper.writeValueAsString(dateTime)); + } + @Configuration protected static class MockObjectMapperConfig { From 92871ea03e3f2d5e96fb953411368b1a6c888879 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 27 Jul 2015 15:12:13 +0200 Subject: [PATCH 2/2] Polish See gh-3600 --- .../autoconfigure/jackson/JacksonAutoConfiguration.java | 4 +++- .../boot/autoconfigure/jackson/JacksonProperties.java | 8 +++++--- .../jackson/JacksonAutoConfigurationTests.java | 1 + .../main/asciidoc/appendix-application-properties.adoc | 1 + 4 files changed, 10 insertions(+), 4 deletions(-) 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 b457aa7126e..8cd7974e4ad 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 @@ -20,6 +20,7 @@ import java.lang.reflect.Field; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; @@ -64,6 +65,7 @@ import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer; * @author Andy Wilkinson * @author Marcel Overdijk * @author Sebastien Deleuze + * @author Johannes Stelzer * @since 1.1.0 */ @Configuration @@ -239,7 +241,7 @@ public class JacksonAutoConfiguration { } private void configureLocale(Jackson2ObjectMapperBuilder builder) { - String locale = this.jacksonProperties.getLocale(); + Locale locale = this.jacksonProperties.getLocale(); if (locale != null) { builder.locale(locale); } 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 af98b099ebd..f687648aac8 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 @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.jackson; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.TimeZone; @@ -34,6 +35,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; * * @author Andy Wilkinson * @author Marcel Overdijk + * @author Johannes Stelzer * @since 1.2.0 */ @ConfigurationProperties(prefix = "spring.jackson") @@ -98,7 +100,7 @@ public class JacksonProperties { /** * Locale used for formatting. */ - private String locale; + private Locale locale; public String getDateFormat() { return this.dateFormat; @@ -160,11 +162,11 @@ public class JacksonProperties { this.timeZone = timeZone; } - public String getLocale() { + public Locale getLocale() { return this.locale; } - public void setLocale(String locale) { + public void setLocale(Locale locale) { this.locale = locale; } 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 9f7ce9b7bff..9158f85e7f6 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 @@ -72,6 +72,7 @@ import static org.mockito.Mockito.mock; * @author Andy Wilkinson * @author Marcel Overdijk * @author Sebastien Deleuze + * @author Johannes Stelzer */ public class JacksonAutoConfigurationTests { 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 c14daa7e39e..dc693fabc01 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -176,6 +176,7 @@ content into your application; rather pick only the properties that you need. spring.jackson.deserialization.*= # see Jackson's DeserializationFeature spring.jackson.generator.*= # see Jackson's JsonGenerator.Feature spring.jackson.joda-date-time-format= # Joda date time format string + spring.jackson.locale= # locale used for formatting spring.jackson.mapper.*= # see Jackson's MapperFeature spring.jackson.parser.*= # see Jackson's JsonParser.Feature spring.jackson.serialization.*= # see Jackson's SerializationFeature