diff --git a/build.gradle b/build.gradle index 219f1604ae..4ec54a38ad 100644 --- a/build.gradle +++ b/build.gradle @@ -739,6 +739,7 @@ project("spring-web") { } testCompile("com.fasterxml.jackson.datatype:jackson-datatype-joda:${jackson2Version}") testCompile("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:${jackson2Version}") + testCompile("com.fasterxml.jackson.module:jackson-module-kotlin:${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 282e386f6d..9c049eda15 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 @@ -75,6 +75,7 @@ import org.springframework.util.StringUtils; *
Compatible with Jackson 2.6 and higher, as of Spring 4.3. @@ -747,6 +748,18 @@ public class Jackson2ObjectMapperBuilder { // jackson-datatype-joda not available } } + + // Kotlin present? + if (ClassUtils.isPresent("kotlin.Unit", this.moduleClassLoader)) { + try { + Class extends Module> kotlinModule = (Class extends Module>) + ClassUtils.forName("com.fasterxml.jackson.module.kotlin.KotlinModule", this.moduleClassLoader); + objectMapper.registerModule(BeanUtils.instantiate(kotlinModule)); + } + catch (ClassNotFoundException ex) { + // jackson-module-kotlin not available + } + } } diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java index 0ab52307e0..562ebbb360 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.java @@ -116,6 +116,7 @@ import org.springframework.context.ApplicationContextAware; *
In case you want to configure Jackson's {@link ObjectMapper} with a custom {@link Module},
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 5af3eb5f4d..3f4e2257bf 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
@@ -65,6 +65,7 @@ import com.fasterxml.jackson.databind.ser.std.NumberSerializer;
import com.fasterxml.jackson.databind.type.SimpleType;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import kotlin.ranges.IntRange;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.Test;
@@ -255,6 +256,10 @@ public class Jackson2ObjectMapperBuilderTests {
Optional