Commit 99de71bf authored by Andy Wilkinson's avatar Andy Wilkinson

Upgrade to Jackson 2.5.1

Closes gh-2332
parent 11a1bc93
...@@ -52,8 +52,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -52,8 +52,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule; 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.DateTimeSerializer;
import com.fasterxml.jackson.datatype.joda.ser.JacksonJodaFormat;
/** /**
* Auto configuration for Jackson. The following auto-configuration will get applied: * Auto configuration for Jackson. The following auto-configuration will get applied:
...@@ -106,7 +106,7 @@ public class JacksonAutoConfiguration { ...@@ -106,7 +106,7 @@ public class JacksonAutoConfiguration {
@Configuration @Configuration
@ConditionalOnClass({ Jackson2ObjectMapperBuilder.class, DateTime.class, @ConditionalOnClass({ Jackson2ObjectMapperBuilder.class, DateTime.class,
DateTimeSerializer.class, JacksonJodaFormat.class }) DateTimeSerializer.class, JacksonJodaDateFormat.class })
static class JodaDateTimeJacksonConfiguration { static class JodaDateTimeJacksonConfiguration {
private final Log log = LogFactory.getLog(JodaDateTimeJacksonConfiguration.class); private final Log log = LogFactory.getLog(JodaDateTimeJacksonConfiguration.class);
...@@ -117,7 +117,7 @@ public class JacksonAutoConfiguration { ...@@ -117,7 +117,7 @@ public class JacksonAutoConfiguration {
@Bean @Bean
public Module jodaDateTimeSerializationModule() { public Module jodaDateTimeSerializationModule() {
SimpleModule module = new SimpleModule(); SimpleModule module = new SimpleModule();
JacksonJodaFormat jacksonJodaFormat = getJacksonJodaFormat(); JacksonJodaDateFormat jacksonJodaFormat = getJacksonJodaDateFormat();
if (jacksonJodaFormat != null) { if (jacksonJodaFormat != null) {
module.addSerializer(DateTime.class, new DateTimeSerializer( module.addSerializer(DateTime.class, new DateTimeSerializer(
jacksonJodaFormat)); jacksonJodaFormat));
...@@ -125,14 +125,14 @@ public class JacksonAutoConfiguration { ...@@ -125,14 +125,14 @@ public class JacksonAutoConfiguration {
return module; return module;
} }
private JacksonJodaFormat getJacksonJodaFormat() { private JacksonJodaDateFormat getJacksonJodaDateFormat() {
if (this.jacksonProperties.getJodaDateTimeFormat() != null) { if (this.jacksonProperties.getJodaDateTimeFormat() != null) {
return new JacksonJodaFormat(DateTimeFormat.forPattern( return new JacksonJodaDateFormat(DateTimeFormat.forPattern(
this.jacksonProperties.getJodaDateTimeFormat()).withZoneUTC()); this.jacksonProperties.getJodaDateTimeFormat()).withZoneUTC());
} }
if (this.jacksonProperties.getDateFormat() != null) { if (this.jacksonProperties.getDateFormat() != null) {
try { try {
return new JacksonJodaFormat(DateTimeFormat.forPattern( return new JacksonJodaDateFormat(DateTimeFormat.forPattern(
this.jacksonProperties.getDateFormat()).withZoneUTC()); this.jacksonProperties.getDateFormat()).withZoneUTC());
} }
catch (IllegalArgumentException ex) { catch (IllegalArgumentException ex) {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.jackson; package org.springframework.boot.autoconfigure.jackson;
import java.io.IOException; import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
...@@ -45,12 +46,17 @@ import com.fasterxml.jackson.databind.JsonSerializer; ...@@ -45,12 +46,17 @@ import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule; 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.hasItem;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
...@@ -124,8 +130,7 @@ public class JacksonAutoConfigurationTests { ...@@ -124,8 +130,7 @@ public class JacksonAutoConfigurationTests {
this.context.register(JacksonAutoConfiguration.class); this.context.register(JacksonAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
ObjectMapper mapper = this.context.getBean(ObjectMapper.class); ObjectMapper mapper = this.context.getBean(ObjectMapper.class);
Date date = new DateTime(1988, 6, 25, 20, 30).toDate(); assertThat(mapper.getDateFormat(), is(instanceOf(StdDateFormat.class)));
assertEquals(String.valueOf(date.getTime()), mapper.writeValueAsString(date));
} }
@Test @Test
...@@ -135,11 +140,10 @@ public class JacksonAutoConfigurationTests { ...@@ -135,11 +140,10 @@ public class JacksonAutoConfigurationTests {
"spring.jackson.date-format:yyyyMMddHHmmss"); "spring.jackson.date-format:yyyyMMddHHmmss");
this.context.refresh(); this.context.refresh();
ObjectMapper mapper = this.context.getBean(ObjectMapper.class); ObjectMapper mapper = this.context.getBean(ObjectMapper.class);
DateTime dateTime = new DateTime(1988, 6, 25, 20, 30, DateTimeZone.UTC); DateFormat dateFormat = mapper.getDateFormat();
assertEquals("\"19880625203000\"", mapper.writeValueAsString(dateTime)); assertThat(dateFormat, is(instanceOf(SimpleDateFormat.class)));
dateTime = new DateTime(1988, 6, 25, 20, 30); assertThat(((SimpleDateFormat) dateFormat).toPattern(),
Date date = dateTime.toDate(); is(equalTo("yyyyMMddHHmmss")));
assertEquals("\"19880625203000\"", mapper.writeValueAsString(date));
} }
@Test @Test
...@@ -165,10 +169,7 @@ public class JacksonAutoConfigurationTests { ...@@ -165,10 +169,7 @@ public class JacksonAutoConfigurationTests {
"spring.jackson.date-format:org.springframework.boot.autoconfigure.jackson.JacksonAutoConfigurationTests.MyDateFormat"); "spring.jackson.date-format:org.springframework.boot.autoconfigure.jackson.JacksonAutoConfigurationTests.MyDateFormat");
this.context.refresh(); this.context.refresh();
ObjectMapper mapper = this.context.getBean(ObjectMapper.class); ObjectMapper mapper = this.context.getBean(ObjectMapper.class);
DateTime dateTime = new DateTime(1988, 6, 25, 20, 30, DateTimeZone.UTC); assertThat(mapper.getDateFormat(), is(instanceOf(MyDateFormat.class)));
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));
} }
public static class MyDateFormat extends SimpleDateFormat { public static class MyDateFormat extends SimpleDateFormat {
...@@ -178,50 +179,24 @@ public class JacksonAutoConfigurationTests { ...@@ -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 @Test
public void noCustomPropertyNamingStrategy() throws Exception { public void noCustomPropertyNamingStrategy() throws Exception {
this.context.register(JacksonAutoConfiguration.class); this.context.register(JacksonAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
ObjectMapper mapper = this.context.getBean(ObjectMapper.class); ObjectMapper mapper = this.context.getBean(ObjectMapper.class);
assertEquals("{\"propertyName\":null}", mapper.writeValueAsString(new Bar())); assertThat(mapper.getPropertyNamingStrategy(), is(nullValue()));
} }
@Test @Test
public void customPropertyNamingStrategyCamelCaseToLowerCaseWithUnderscores() public void customPropertyNamingStrategyField() throws Exception {
throws Exception {
this.context.register(JacksonAutoConfiguration.class); this.context.register(JacksonAutoConfiguration.class);
EnvironmentTestUtils EnvironmentTestUtils
.addEnvironment(this.context, .addEnvironment(this.context,
"spring.jackson.property-naming-strategy:CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES"); "spring.jackson.property-naming-strategy:CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES");
this.context.refresh(); this.context.refresh();
ObjectMapper mapper = this.context.getBean(ObjectMapper.class); ObjectMapper mapper = this.context.getBean(ObjectMapper.class);
assertEquals("{\"property_name\":null}", mapper.writeValueAsString(new Bar())); assertThat(mapper.getPropertyNamingStrategy(),
} is(instanceOf(LowerCaseWithUnderscoresStrategy.class)));
@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()));
} }
@Test @Test
...@@ -233,7 +208,8 @@ public class JacksonAutoConfigurationTests { ...@@ -233,7 +208,8 @@ public class JacksonAutoConfigurationTests {
"spring.jackson.property-naming-strategy:com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy"); "spring.jackson.property-naming-strategy:com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy");
this.context.refresh(); this.context.refresh();
ObjectMapper mapper = this.context.getBean(ObjectMapper.class); ObjectMapper mapper = this.context.getBean(ObjectMapper.class);
assertEquals("{\"property_name\":null}", mapper.writeValueAsString(new Bar())); assertThat(mapper.getPropertyNamingStrategy(),
is(instanceOf(LowerCaseWithUnderscoresStrategy.class)));
} }
@Test @Test
......
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
<hsqldb.version>2.3.2</hsqldb.version> <hsqldb.version>2.3.2</hsqldb.version>
<httpasyncclient.version>4.0.2</httpasyncclient.version> <httpasyncclient.version>4.0.2</httpasyncclient.version>
<httpclient.version>4.3.6</httpclient.version> <httpclient.version>4.3.6</httpclient.version>
<jackson.version>2.4.5</jackson.version> <jackson.version>2.5.1</jackson.version>
<janino.version>2.6.1</janino.version> <janino.version>2.6.1</janino.version>
<javassist.version>3.18.1-GA</javassist.version> <!-- Same as Hibernate --> <javassist.version>3.18.1-GA</javassist.version> <!-- Same as Hibernate -->
<javax-cache.version>1.0.0</javax-cache.version> <javax-cache.version>1.0.0</javax-cache.version>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment