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 7eb7acdd987..804e0a09dc8 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,8 +18,10 @@ 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.List; import java.util.Map; import org.springframework.beans.FatalBeanException; @@ -35,6 +37,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -95,8 +98,22 @@ import com.fasterxml.jackson.databind.module.SimpleModule; * </bean> * * + * In case you want to configure Jackson's {@link ObjectMapper} with a {@link Module}, you + * can register Modules using {@link #setModules(java.util.List)} + * + *
+ * <bean class="org.springframework.web.context.support.Jackson2ObjectMapperFactoryBean">
+ *   <property name="modules">
+ *     <list>
+ *       <bean class="org.example.jackson.module.MySampleModule"/>
+ *     </list>
+ *   </property>
+ * </bean>
+ * 
+ * * @author Dmitry Katsubo * @author Rossen Stoyanchev + * @author Brian Clozel * @since 3.2 */ public class Jackson2ObjectMapperFactoryBean implements FactoryBean, InitializingBean { @@ -105,6 +122,8 @@ public class Jackson2ObjectMapperFactoryBean implements FactoryBean features = new HashMap(); + private final List modules = new ArrayList(); + private DateFormat dateFormat; private AnnotationIntrospector annotationIntrospector; @@ -258,6 +277,18 @@ public class Jackson2ObjectMapperFactoryBean implements FactoryBean modules) { + if(modules != null) { + this.modules.addAll(modules); + } + } + @Override public void afterPropertiesSet() { if (this.objectMapper == null) { @@ -286,6 +317,10 @@ public class Jackson2ObjectMapperFactoryBean implements FactoryBeanDmitry Katsubo + * @author Brian Clozel */ public class Jackson2ObjectMapperFactoryBeanTests { @@ -151,6 +155,20 @@ public class Jackson2ObjectMapperFactoryBeanTests { assertEquals(dateFormat, this.factory.getObject().getDeserializationConfig().getDateFormat()); } + @Test + public void testSetModules() { + JsonSerializer serializer1 = new NumberSerializer(); + SimpleModule module = new SimpleModule(); + module.addSerializer(Boolean.class,serializer1); + + this.factory.setModules(Arrays.asList(new Module[]{module})); + this.factory.afterPropertiesSet(); + ObjectMapper objectMapper = this.factory.getObject(); + + Serializers serializers = getSerializerFactoryConfig(objectMapper).serializers().iterator().next(); + assertTrue(serializers.findSerializer(null, SimpleType.construct(Boolean.class), null) == serializer1); + } + @Test public void testSimpleSetup() { this.factory.afterPropertiesSet();