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 eeb8d826a2..2f83edd77d 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 @@ -52,8 +52,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat; import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer; -import com.fasterxml.jackson.datatype.joda.ser.JacksonJodaFormat; /** * Auto configuration for Jackson. The following auto-configuration will get applied: @@ -106,7 +106,7 @@ public class JacksonAutoConfiguration { @Configuration @ConditionalOnClass({ Jackson2ObjectMapperBuilder.class, DateTime.class, - DateTimeSerializer.class, JacksonJodaFormat.class }) + DateTimeSerializer.class, JacksonJodaDateFormat.class }) static class JodaDateTimeJacksonConfiguration { private final Log log = LogFactory.getLog(JodaDateTimeJacksonConfiguration.class); @@ -117,7 +117,7 @@ public class JacksonAutoConfiguration { @Bean public Module jodaDateTimeSerializationModule() { SimpleModule module = new SimpleModule(); - JacksonJodaFormat jacksonJodaFormat = getJacksonJodaFormat(); + JacksonJodaDateFormat jacksonJodaFormat = getJacksonJodaDateFormat(); if (jacksonJodaFormat != null) { module.addSerializer(DateTime.class, new DateTimeSerializer( jacksonJodaFormat)); @@ -125,14 +125,14 @@ public class JacksonAutoConfiguration { return module; } - private JacksonJodaFormat getJacksonJodaFormat() { + private JacksonJodaDateFormat getJacksonJodaDateFormat() { if (this.jacksonProperties.getJodaDateTimeFormat() != null) { - return new JacksonJodaFormat(DateTimeFormat.forPattern( + return new JacksonJodaDateFormat(DateTimeFormat.forPattern( this.jacksonProperties.getJodaDateTimeFormat()).withZoneUTC()); } if (this.jacksonProperties.getDateFormat() != null) { try { - return new JacksonJodaFormat(DateTimeFormat.forPattern( + return new JacksonJodaDateFormat(DateTimeFormat.forPattern( this.jacksonProperties.getDateFormat()).withZoneUTC()); } catch (IllegalArgumentException ex) { 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 65da35b082..c99ceba496 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 @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.jackson; import java.io.IOException; +import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; @@ -45,12 +46,17 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.util.StdDateFormat; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; @@ -124,8 +130,7 @@ public class JacksonAutoConfigurationTests { this.context.register(JacksonAutoConfiguration.class); this.context.refresh(); ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - Date date = new DateTime(1988, 6, 25, 20, 30).toDate(); - assertEquals(String.valueOf(date.getTime()), mapper.writeValueAsString(date)); + assertThat(mapper.getDateFormat(), is(instanceOf(StdDateFormat.class))); } @Test @@ -135,11 +140,10 @@ public class JacksonAutoConfigurationTests { "spring.jackson.date-format:yyyyMMddHHmmss"); this.context.refresh(); ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - DateTime dateTime = new DateTime(1988, 6, 25, 20, 30, DateTimeZone.UTC); - assertEquals("\"19880625203000\"", mapper.writeValueAsString(dateTime)); - dateTime = new DateTime(1988, 6, 25, 20, 30); - Date date = dateTime.toDate(); - assertEquals("\"19880625203000\"", mapper.writeValueAsString(date)); + DateFormat dateFormat = mapper.getDateFormat(); + assertThat(dateFormat, is(instanceOf(SimpleDateFormat.class))); + assertThat(((SimpleDateFormat) dateFormat).toPattern(), + is(equalTo("yyyyMMddHHmmss"))); } @Test @@ -165,10 +169,7 @@ public class JacksonAutoConfigurationTests { "spring.jackson.date-format:org.springframework.boot.autoconfigure.jackson.JacksonAutoConfigurationTests.MyDateFormat"); this.context.refresh(); ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - DateTime dateTime = new DateTime(1988, 6, 25, 20, 30, DateTimeZone.UTC); - assertEquals("\"1988-06-25T20:30:00.000Z\"", mapper.writeValueAsString(dateTime)); - Date date = new DateTime(1988, 6, 25, 20, 30).toDate(); - assertEquals("\"1988-06-25 20:30:00\"", mapper.writeValueAsString(date)); + assertThat(mapper.getDateFormat(), is(instanceOf(MyDateFormat.class))); } public static class MyDateFormat extends SimpleDateFormat { @@ -178,50 +179,24 @@ public class JacksonAutoConfigurationTests { } } - /* - * ObjectMapper does not contain method to get the property naming strategy of the - * mapper. See https://github.com/FasterXML/jackson-databind/issues/559 If such a - * method will be provided below tests can be simplified. - */ - @Test public void noCustomPropertyNamingStrategy() throws Exception { this.context.register(JacksonAutoConfiguration.class); this.context.refresh(); ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - assertEquals("{\"propertyName\":null}", mapper.writeValueAsString(new Bar())); + assertThat(mapper.getPropertyNamingStrategy(), is(nullValue())); } @Test - public void customPropertyNamingStrategyCamelCaseToLowerCaseWithUnderscores() - throws Exception { + public void customPropertyNamingStrategyField() throws Exception { this.context.register(JacksonAutoConfiguration.class); EnvironmentTestUtils .addEnvironment(this.context, "spring.jackson.property-naming-strategy:CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES"); this.context.refresh(); ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - assertEquals("{\"property_name\":null}", mapper.writeValueAsString(new Bar())); - } - - @Test - public void customPropertyNamingStrategyPascalCaseToCamelCase() throws Exception { - this.context.register(JacksonAutoConfiguration.class); - EnvironmentTestUtils.addEnvironment(this.context, - "spring.jackson.property-naming-strategy:PASCAL_CASE_TO_CAMEL_CASE"); - this.context.refresh(); - ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - assertEquals("{\"PropertyName\":null}", mapper.writeValueAsString(new Bar())); - } - - @Test - public void customPropertyNamingStrategyLowerCase() throws Exception { - this.context.register(JacksonAutoConfiguration.class); - EnvironmentTestUtils.addEnvironment(this.context, - "spring.jackson.property-naming-strategy:LOWER_CASE"); - this.context.refresh(); - ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - assertEquals("{\"propertyname\":null}", mapper.writeValueAsString(new Bar())); + assertThat(mapper.getPropertyNamingStrategy(), + is(instanceOf(LowerCaseWithUnderscoresStrategy.class))); } @Test @@ -233,7 +208,8 @@ public class JacksonAutoConfigurationTests { "spring.jackson.property-naming-strategy:com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy"); this.context.refresh(); ObjectMapper mapper = this.context.getBean(ObjectMapper.class); - assertEquals("{\"property_name\":null}", mapper.writeValueAsString(new Bar())); + assertThat(mapper.getPropertyNamingStrategy(), + is(instanceOf(LowerCaseWithUnderscoresStrategy.class))); } @Test diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 6e9a02d2bc..4a4466ce6b 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -77,7 +77,7 @@ 2.3.2 4.0.2 4.3.6 - 2.4.5 + 2.5.1 2.6.1 3.18.1-GA 1.0.0