Skip to content

Commit 5465506

Browse files
committed
Register automatically Jackson's JDK 8 module when available
Issue: SPR-12983
1 parent a89c0ec commit 5465506

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ project("spring-web") {
715715
exclude group: "org.apache.taglibs", module: "taglibs-standard-spec"
716716
}
717717
testCompile("com.fasterxml.jackson.datatype:jackson-datatype-joda:${jackson2Version}")
718+
testCompile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${jackson2Version}")
718719
testRuntime("com.sun.mail:javax.mail:${javamailVersion}")
719720
}
720721
}

spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,17 @@ else if (feature instanceof MapperFeature) {
664664

665665
@SuppressWarnings("unchecked")
666666
private void registerWellKnownModulesIfAvailable(ObjectMapper objectMapper) {
667+
// Java 8 java.util.Optional class present?
668+
if (ClassUtils.isPresent("java.util.Optional", this.moduleClassLoader)) {
669+
try {
670+
Class<? extends Module> jdk8Module = (Class<? extends Module>)
671+
ClassUtils.forName("com.fasterxml.jackson.datatype.jdk8.Jdk8Module", this.moduleClassLoader);
672+
objectMapper.registerModule(BeanUtils.instantiate(jdk8Module));
673+
}
674+
catch (ClassNotFoundException ex) {
675+
// jackson-datatype-jdk8 not available
676+
}
677+
}
667678
// Java 8 java.time package present?
668679
if (ClassUtils.isPresent("java.time.LocalDate", this.moduleClassLoader)) {
669680
try {

spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.HashMap;
2626
import java.util.Locale;
2727
import java.util.Map;
28+
import java.util.Optional;
2829
import java.util.TimeZone;
2930

3031
import com.fasterxml.jackson.annotation.JsonFilter;
@@ -238,9 +239,13 @@ public void modulesToInstallByInstance() {
238239
@Test
239240
public void defaultModules() throws JsonProcessingException, UnsupportedEncodingException {
240241
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
242+
241243
Long timestamp = 1322903730000L;
242244
DateTime dateTime = new DateTime(timestamp, DateTimeZone.UTC);
243245
assertEquals(timestamp.toString(), new String(objectMapper.writeValueAsBytes(dateTime), "UTF-8"));
246+
247+
Optional<String> optional = Optional.of("test");
248+
assertEquals("\"test\"", new String(objectMapper.writeValueAsBytes(optional), "UTF-8"));
244249
}
245250

246251
@Test // SPR-12634

0 commit comments

Comments
 (0)