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 804e0a09dc..0cdad795f4 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 @@ -18,17 +18,12 @@ package org.springframework.http.converter.json; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.springframework.beans.FatalBeanException; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.util.Assert; - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -42,6 +37,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.FatalBeanException; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; + /** * A {@link FactoryBean} for creating a Jackson 2.x {@link ObjectMapper} with setters * to enable or disable Jackson features from within XML configuration. @@ -114,25 +117,30 @@ import com.fasterxml.jackson.databind.module.SimpleModule; * @author Dmitry Katsubo * @author Rossen Stoyanchev * @author Brian Clozel + * @author Juergen Hoeller * @since 3.2 */ -public class Jackson2ObjectMapperFactoryBean implements FactoryBean, InitializingBean { +public class Jackson2ObjectMapperFactoryBean implements FactoryBean, BeanClassLoaderAware, InitializingBean { private ObjectMapper objectMapper; - private Map features = new HashMap(); - - private final List modules = new ArrayList(); - private DateFormat dateFormat; + private JsonInclude.Include serializationInclusion; + private AnnotationIntrospector annotationIntrospector; private final Map, JsonSerializer> serializers = new LinkedHashMap, JsonSerializer>(); private final Map, JsonDeserializer> deserializers = new LinkedHashMap, JsonDeserializer>(); - private JsonInclude.Include serializationInclusion; + private final Map features = new HashMap(); + + private final List modules = new LinkedList(); + + private boolean findModules; + + private ClassLoader beanClassLoader; /** @@ -164,13 +172,20 @@ public class Jackson2ObjectMapperFactoryBean implements FactoryBeanIf this mode is not set, Spring's Jackson2ObjectMapperFactoryBean itself + * will try to find the JSR-310 and Joda-Time support modules on the classpath - + * provided that Java 8 and Joda-Time themselves are available, respectively. + * @see com.fasterxml.jackson.databind.ObjectMapper#findModules() */ - public void setSerializationInclusion(JsonInclude.Include serializationInclusion) { - this.serializationInclusion = serializationInclusion; + public void setFindModules(boolean findModules) { + this.findModules = findModules; } /** - * Sets the list of modules to be registered with {@link ObjectMapper}. - * @param modules the list of modules - * @see com.fasterxml.jackson.databind.Module + * Set the list of modules to be registered with the {@link ObjectMapper}. * @since 4.0 + * @see com.fasterxml.jackson.databind.Module */ public void setModules(List modules) { - if(modules != null) { + if (modules != null) { this.modules.addAll(modules); } } + @Override + public void setBeanClassLoader(ClassLoader beanClassLoader) { + this.beanClassLoader = beanClassLoader; + } + + @Override public void afterPropertiesSet() { if (this.objectMapper == null) { @@ -299,6 +323,14 @@ public class Jackson2ObjectMapperFactoryBean implements FactoryBean jsr310Module = (Class) + cl.loadClass("com.fasterxml.jackson.datatype.jsr310.JSR310Module"); + this.objectMapper.registerModule(BeanUtils.instantiate(jsr310Module)); + } + catch (ClassNotFoundException ex) { + // jackson-datatype-jsr310 not available + } + } + // Joda-Time present? + if (ClassUtils.isPresent("org.joda.time.LocalDate", cl)) { + try { + Class jodaModule = (Class) + cl.loadClass("com.fasterxml.jackson.datatype.joda.JodaModule"); + this.objectMapper.registerModule(BeanUtils.instantiate(jodaModule)); + } + catch (ClassNotFoundException ex) { + // jackson-datatype-joda not available + } } }