public class Jackson2ObjectMapperFactoryBean extends Object implements FactoryBean<ObjectMapper>, BeanClassLoaderAware, ApplicationContextAware, InitializingBean
FactoryBean
for creating a Jackson 2.x ObjectMapper
(default) or
XmlMapper
(createXmlMapper
property set to true) with setters
to enable or disable Jackson features from within XML configuration.
It customizes Jackson defaults properties with the following ones:
MapperFeature.DEFAULT_VIEW_INCLUSION
is disabledDeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
is disabledExample usage with
MappingJackson2HttpMessageConverter
:
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:autoDetectFields="false" p:autoDetectGettersSetters="false" p:annotationIntrospector-ref="jaxbAnnotationIntrospector" /> </property> </bean>
Example usage with MappingJackson2JsonView:
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:failOnEmptyBeans="false" p:indentOutput="true"> <property name="serializers"> <array> <bean class="org.mycompany.MyCustomSerializer" /> </array> </property> </bean> </property> </bean>
In case there are no specific setters provided (for some rarely used options),
you can still use the more general methods setFeaturesToEnable(java.lang.Object...)
and
setFeaturesToDisable(java.lang.Object...)
.
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="featuresToEnable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature$WRAP_ROOT_VALUE"/> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature$CLOSE_CLOSEABLE"/> </array> </property> <property name="featuresToDisable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.MapperFeature$USE_ANNOTATIONS"/> </array> </property> </bean>
In case you want to configure Jackson's ObjectMapper
with a custom Module
,
you can register one or more such Modules by class name via setModulesToInstall(java.lang.Class<? extends com.fasterxml.jackson.databind.Module>...)
:
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="modulesToInstall" value="myapp.jackson.MySampleModule,myapp.jackson.MyOtherModule"/> </beanNote that Jackson's JSR-310 and Joda-Time support modules will be registered automatically when available (and when Java 8 and Joda-Time themselves are available, respectively).
Tested against Jackson 2.2, 2.3 and 2.4; compatible with Jackson 2.0 and higher.
Constructor and Description |
---|
Jackson2ObjectMapperFactoryBean() |
Modifier and Type | Method and Description |
---|---|
void |
afterPropertiesSet()
Invoked by a BeanFactory after it has set all bean properties supplied
(and satisfied BeanFactoryAware and ApplicationContextAware).
|
ObjectMapper |
getObject()
Return the singleton ObjectMapper.
|
Class<?> |
getObjectType()
Return the type of object that this FactoryBean creates,
or
null if not known in advance. |
boolean |
isSingleton()
Is the object managed by this factory a singleton? That is,
will
FactoryBean.getObject() always return the same object
(a reference that can be cached)? |
void |
setAnnotationIntrospector(AnnotationIntrospector annotationIntrospector)
Set an
AnnotationIntrospector for both serialization and deserialization. |
void |
setApplicationContext(ApplicationContext applicationContext)
Set the builder
ApplicationContext in order to autowire Jackson handlers (JsonSerializer ,
JsonDeserializer , KeyDeserializer , TypeResolverBuilder and TypeIdResolver ). |
void |
setAutoDetectFields(boolean autoDetectFields)
Shortcut for
MapperFeature.AUTO_DETECT_FIELDS option. |
void |
setAutoDetectGettersSetters(boolean autoDetectGettersSetters)
Shortcut for
MapperFeature.AUTO_DETECT_SETTERS /
MapperFeature.AUTO_DETECT_GETTERS option. |
void |
setBeanClassLoader(ClassLoader beanClassLoader)
Callback that supplies the bean
class loader to
a bean instance. |
void |
setCreateXmlMapper(boolean createXmlMapper)
If set to true and no custom
ObjectMapper has been set, a XmlMapper
will be created using its default constructor. |
void |
setDateFormat(DateFormat dateFormat)
Define the format for date/time with the given
DateFormat . |
void |
setDefaultViewInclusion(boolean defaultViewInclusion)
Shortcut for
MapperFeature.DEFAULT_VIEW_INCLUSION option. |
void |
setDeserializersByType(Map<Class<?>,JsonDeserializer<?>> deserializers)
Configure custom deserializers for the given types.
|
void |
setFailOnEmptyBeans(boolean failOnEmptyBeans)
Shortcut for
SerializationFeature.FAIL_ON_EMPTY_BEANS option. |
void |
setFailOnUnknownProperties(boolean failOnUnknownProperties)
Shortcut for
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES option. |
void |
setFeaturesToDisable(Object... featuresToDisable)
Specify features to disable.
|
void |
setFeaturesToEnable(Object... featuresToEnable)
Specify features to enable.
|
void |
setFindModulesViaServiceLoader(boolean findModules)
Set whether to let Jackson find available modules via the JDK ServiceLoader,
based on META-INF metadata in the classpath.
|
void |
setHandlerInstantiator(HandlerInstantiator handlerInstantiator)
Customize the construction of Jackson handlers (
JsonSerializer , JsonDeserializer ,
KeyDeserializer , TypeResolverBuilder and TypeIdResolver ). |
void |
setIndentOutput(boolean indentOutput)
Shortcut for
SerializationFeature.INDENT_OUTPUT option. |
void |
setLocale(Locale locale)
Override the default
Locale to use for formatting. |
void |
setMixIns(Map<Class<?>,Class<?>> mixIns)
Add mix-in annotations to use for augmenting specified class or interface.
|
void |
setModules(List<Module> modules)
Set a complete list of modules to be registered with the
ObjectMapper . |
void |
setModulesToInstall(Class<? extends Module>... modules)
Specify one or more modules by class (or class name in XML)
to be registered with the
ObjectMapper . |
void |
setObjectMapper(ObjectMapper objectMapper)
Set the
ObjectMapper instance to use. |
void |
setPropertyNamingStrategy(PropertyNamingStrategy propertyNamingStrategy)
Specify a
PropertyNamingStrategy to
configure the ObjectMapper with. |
void |
setSerializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include serializationInclusion)
Set a custom inclusion strategy for serialization.
|
void |
setSerializers(JsonSerializer<?>... serializers)
Configure custom serializers.
|
void |
setSerializersByType(Map<Class<?>,JsonSerializer<?>> serializers)
Configure custom serializers for the given types.
|
void |
setSimpleDateFormat(String format)
Define the date/time format with a
SimpleDateFormat . |
void |
setTimeZone(TimeZone timeZone)
Override the default
TimeZone to use for formatting. |
public void setObjectMapper(ObjectMapper objectMapper)
ObjectMapper
instance to use. If not set, the ObjectMapper
will be created using its default constructor.public void setCreateXmlMapper(boolean createXmlMapper)
ObjectMapper
has been set, a XmlMapper
will be created using its default constructor.public void setDateFormat(DateFormat dateFormat)
DateFormat
.
Note: Setting this property makes the exposed ObjectMapper
non-thread-safe, according to Jackson's thread safety rules.
setSimpleDateFormat(String)
public void setSimpleDateFormat(String format)
SimpleDateFormat
.
Note: Setting this property makes the exposed ObjectMapper
non-thread-safe, according to Jackson's thread safety rules.
setDateFormat(DateFormat)
public void setLocale(Locale locale)
Locale
to use for formatting.
Default value used is Locale.getDefault()
.public void setTimeZone(TimeZone timeZone)
TimeZone
to use for formatting.
Default value used is UTC (NOT local timezone).public void setAnnotationIntrospector(AnnotationIntrospector annotationIntrospector)
AnnotationIntrospector
for both serialization and deserialization.public void setPropertyNamingStrategy(PropertyNamingStrategy propertyNamingStrategy)
PropertyNamingStrategy
to
configure the ObjectMapper
with.public void setSerializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include serializationInclusion)
JsonInclude.Include
public void setSerializers(JsonSerializer<?>... serializers)
JsonSerializer.handledType()
, which must not be
null
.setSerializersByType(Map)
public void setSerializersByType(Map<Class<?>,JsonSerializer<?>> serializers)
setSerializers(JsonSerializer...)
public void setDeserializersByType(Map<Class<?>,JsonDeserializer<?>> deserializers)
public void setMixIns(Map<Class<?>,Class<?>> mixIns)
mixIns
- Map of entries with target classes (or interface) whose annotations
to effectively override as key and mix-in classes (or interface) whose
annotations are to be "added" to target's annotations as value.ObjectMapper.addMixInAnnotations(Class, Class)
public void setAutoDetectFields(boolean autoDetectFields)
MapperFeature.AUTO_DETECT_FIELDS
option.public void setAutoDetectGettersSetters(boolean autoDetectGettersSetters)
MapperFeature.AUTO_DETECT_SETTERS
/
MapperFeature.AUTO_DETECT_GETTERS
option.public void setDefaultViewInclusion(boolean defaultViewInclusion)
MapperFeature.DEFAULT_VIEW_INCLUSION
option.public void setFailOnUnknownProperties(boolean failOnUnknownProperties)
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
option.public void setFailOnEmptyBeans(boolean failOnEmptyBeans)
SerializationFeature.FAIL_ON_EMPTY_BEANS
option.public void setIndentOutput(boolean indentOutput)
SerializationFeature.INDENT_OUTPUT
option.public void setFeaturesToEnable(Object... featuresToEnable)
public void setFeaturesToDisable(Object... featuresToDisable)
public void setModules(List<Module> modules)
ObjectMapper
.
Note: If this is set, no finding of modules is going to happen - not by
Jackson, and not by Spring either (see setFindModulesViaServiceLoader(boolean)
).
As a consequence, specifying an empty list here will suppress any kind of
module detection.
Specify either this or setModulesToInstall(java.lang.Class<? extends com.fasterxml.jackson.databind.Module>...)
, not both.
Module
public void setModulesToInstall(Class<? extends Module>... modules)
ObjectMapper
.
Modules specified here will be registered after
Spring's autodetection of JSR-310 and Joda-Time, or Jackson's
finding of modules (see setFindModulesViaServiceLoader(boolean)
),
allowing to eventually override their configuration.
Specify either this or setModules(java.util.List<com.fasterxml.jackson.databind.Module>)
, not both.
Module
public void setFindModulesViaServiceLoader(boolean findModules)
If 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.
ObjectMapper.findModules()
public void setHandlerInstantiator(HandlerInstantiator handlerInstantiator)
JsonSerializer
, JsonDeserializer
,
KeyDeserializer
, TypeResolverBuilder
and TypeIdResolver
).setApplicationContext(ApplicationContext)
public void setBeanClassLoader(ClassLoader beanClassLoader)
BeanClassLoaderAware
class loader
to
a bean instance.
Invoked after the population of normal bean properties but
before an initialization callback such as
InitializingBean's
InitializingBean.afterPropertiesSet()
method or a custom init-method.
setBeanClassLoader
in interface BeanClassLoaderAware
beanClassLoader
- the owning class loader; may be null
in
which case a default ClassLoader
must be used, for example
the ClassLoader
obtained via
ClassUtils.getDefaultClassLoader()
public void afterPropertiesSet()
InitializingBean
This method allows the bean instance to perform initialization only possible when all bean properties have been set and to throw an exception in the event of misconfiguration.
afterPropertiesSet
in interface InitializingBean
public void setApplicationContext(ApplicationContext applicationContext)
ApplicationContext
in order to autowire Jackson handlers (JsonSerializer
,
JsonDeserializer
, KeyDeserializer
, TypeResolverBuilder
and TypeIdResolver
).setApplicationContext
in interface ApplicationContextAware
applicationContext
- the ApplicationContext object to be used by this objectJackson2ObjectMapperBuilder.applicationContext(ApplicationContext)
,
SpringHandlerInstantiator
public ObjectMapper getObject()
getObject
in interface FactoryBean<ObjectMapper>
null
)FactoryBeanNotInitializedException
public Class<?> getObjectType()
FactoryBean
null
if not known in advance.
This allows one to check for specific types of beans without instantiating objects, for example on autowiring.
In the case of implementations that are creating a singleton object, this method should try to avoid singleton creation as far as possible; it should rather estimate the type in advance. For prototypes, returning a meaningful type here is advisable too.
This method can be called before this FactoryBean has been fully initialized. It must not rely on state created during initialization; of course, it can still use such state if available.
NOTE: Autowiring will simply ignore FactoryBeans that return
null
here. Therefore it is highly recommended to implement
this method properly, using the current state of the FactoryBean.
getObjectType
in interface FactoryBean<ObjectMapper>
null
if not known at the time of the callListableBeanFactory.getBeansOfType(java.lang.Class<T>)
public boolean isSingleton()
FactoryBean
FactoryBean.getObject()
always return the same object
(a reference that can be cached)?
NOTE: If a FactoryBean indicates to hold a singleton object,
the object returned from getObject()
might get cached
by the owning BeanFactory. Hence, do not return true
unless the FactoryBean always exposes the same reference.
The singleton status of the FactoryBean itself will generally be provided by the owning BeanFactory; usually, it has to be defined as singleton there.
NOTE: This method returning false
does not
necessarily indicate that returned objects are independent instances.
An implementation of the extended SmartFactoryBean
interface
may explicitly indicate independent instances through its
SmartFactoryBean.isPrototype()
method. Plain FactoryBean
implementations which do not implement this extended interface are
simply assumed to always return independent instances if the
isSingleton()
implementation returns false
.
isSingleton
in interface FactoryBean<ObjectMapper>
FactoryBean.getObject()
,
SmartFactoryBean.isPrototype()