diff --git a/build.gradle b/build.gradle index 878d73ef02..d5e7ffe538 100644 --- a/build.gradle +++ b/build.gradle @@ -715,6 +715,7 @@ project("spring-web") { exclude group: "org.apache.taglibs", module: "taglibs-standard-spec" } testCompile("com.fasterxml.jackson.datatype:jackson-datatype-joda:${jackson2Version}") + testCompile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${jackson2Version}") testRuntime("com.sun.mail:javax.mail:${javamailVersion}") } } diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java index 04acdc8631..f23147199b 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java @@ -664,6 +664,17 @@ public class Jackson2ObjectMapperBuilder { @SuppressWarnings("unchecked") private void registerWellKnownModulesIfAvailable(ObjectMapper objectMapper) { + // Java 8 java.util.Optional class present? + if (ClassUtils.isPresent("java.util.Optional", this.moduleClassLoader)) { + try { + Class jdk8Module = (Class) + ClassUtils.forName("com.fasterxml.jackson.datatype.jdk8.Jdk8Module", this.moduleClassLoader); + objectMapper.registerModule(BeanUtils.instantiate(jdk8Module)); + } + catch (ClassNotFoundException ex) { + // jackson-datatype-jdk8 not available + } + } // Java 8 java.time package present? if (ClassUtils.isPresent("java.time.LocalDate", this.moduleClassLoader)) { try { diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java index e8b29ac285..7496fea2fd 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java @@ -25,6 +25,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.TimeZone; import com.fasterxml.jackson.annotation.JsonFilter; @@ -238,9 +239,13 @@ public class Jackson2ObjectMapperBuilderTests { @Test public void defaultModules() throws JsonProcessingException, UnsupportedEncodingException { ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build(); + Long timestamp = 1322903730000L; DateTime dateTime = new DateTime(timestamp, DateTimeZone.UTC); assertEquals(timestamp.toString(), new String(objectMapper.writeValueAsBytes(dateTime), "UTF-8")); + + Optional optional = Optional.of("test"); + assertEquals("\"test\"", new String(objectMapper.writeValueAsBytes(optional), "UTF-8")); } @Test // SPR-12634