From a5e39167246c505c11ffd9958a758e49c85b41d6 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 2 Oct 2013 15:43:42 +0200 Subject: [PATCH] Add Jackson's Modules registration in Jackson2OMFactoryBean Prior to this commit, one couldn't configure Jackson's ObjectMapper with (De)SerializerModifiers or advanced configuration features using XML configuration. This commit updates the FactoryBean and adds a setModule method that will register Modules with the ObjectMapper. Note that this commit is only about XML configuration, since this feature was already available with JavaConfig. Issue: SPR-10429 --- .../json/Jackson2ObjectMapperFactoryBean.java | 35 +++++++++++++++++++ .../Jackson2ObjectMapperFactoryBeanTests.java | 20 ++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) 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();