Add a section about message converters customization in the refdoc

Issue: SPR-13411
This commit is contained in:
Sebastien Deleuze 2015-08-31 21:48:15 +02:00
parent af905aaaea
commit 12937680b7
1 changed files with 98 additions and 0 deletions

View File

@ -4566,6 +4566,28 @@ classpath.
.. `RssChannelHttpMessageConverter` converts RSS feeds -- added if Rome is present on .. `RssChannelHttpMessageConverter` converts RSS feeds -- added if Rome is present on
the classpath. the classpath.
See <<mvc-config-message-converters>> for more information about how to customize these
default converters.
[NOTE]
====
Jackson JSON and XML converters are created using `ObjectMapper` instances created by
{javadoc-baseurl}/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.html[`Jackson2ObjectMapperBuilder`]
in order to provide a better default configuration.
This builder customizes Jackson's default properties with the following ones:
. http://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html#FAIL_ON_UNKNOWN_PROPERTIES[`DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES`] is disabled.
. http://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/MapperFeature.html#DEFAULT_VIEW_INCLUSION[`MapperFeature.DEFAULT_VIEW_INCLUSION`] is disabled.
It also automatically registers the following well-known modules if they are detected on the classpath:
. https://github.com/FasterXML/jackson-datatype-jdk7[jackson-datatype-jdk7]: support for Java 7 types like `java.nio.file.Path`.
. https://github.com/FasterXML/jackson-datatype-joda[jackson-datatype-joda]: support for Joda-Time types.
. https://github.com/FasterXML/jackson-datatype-jsr310[jackson-datatype-jsr310]: support for Java 8 Date & Time API types.
. https://github.com/FasterXML/jackson-datatype-jdk8[jackson-datatype-jdk8]: support for other Java 8 types like `Optional`.
====
[[mvc-config-customize]] [[mvc-config-customize]]
@ -5299,6 +5321,82 @@ And the same in XML, use the `<mvc:path-matching>` element:
[[mvc-config-message-converters]]
=== Message Converters
Customization of `HttpMessageConverter` can be achieved in Java config by overriding
{javadoc-baseurl}/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html#configureMessageConverters-java.util.List-[`configureMessageConverters()`]
if you want to replace the default converters created by Spring MVC, or by overriding
{javadoc-baseurl}/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html#extendMessageConverters-java.util.List-[`extendMessageConverters()`]
if you just want to customize them or add additional converters to the default ones.
Below is an example that adds Jackson JSON and XML converters with a customized
`ObjectMapper` instead of default ones:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
.indentOutput(true)
.dateFormat(new SimpleDateFormat("yyyy-MM-dd"))
.modulesToInstall(new ParameterNamesModule());
converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
converters.add(new MappingJackson2XmlHttpMessageConverter(builder.xml().build()));
}
}
----
In this example, `Jackson2ObjectMapperBuilder` is used to create a common configuration for
both `MappingJackson2HttpMessageConverter` and `MappingJackson2XmlHttpMessageConverter` with
indentation enabled, a customized date format and the registration of
https://github.com/FasterXML/jackson-module-parameter-names[jackson-module-parameter-names]
that adds support for accessing parameter names (feature added in Java 8).
[NOTE]
====
Enabling indentation with Jackson XML support requires
http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.codehaus.woodstox%22%20AND%20a%3A%22woodstox-core-asl%22[`woodstox-core-asl`]
dependency in addition to http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22jackson-dataformat-xml%22[`jackson-dataformat-xml`] one.
====
Other interesting Jackson modules are available:
. https://github.com/zalando/jackson-datatype-money[jackson-datatype-money]: support for `javax.money` types (unofficial module)
. https://github.com/FasterXML/jackson-datatype-hibernate[jackson-datatype-hibernate]: support for Hibernate specific types and properties (including lazy-loading aspects)
It is also possible to do the same in XML:
[source,xml,indent=0]
[subs="verbatim,quotes"]
----
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
<bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
<property name="objectMapper" ref="xmlMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
p:indentOutput="true"
p:simpleDateFormat="yyyy-MM-dd"
p:modulesToInstall="com.fasterxml.jackson.module.paramnames.ParameterNamesModule" />
<bean id="xmlMapper" parent="objectMapper" p:createXmlMapper="true" />
----
[[mvc-config-advanced-java]] [[mvc-config-advanced-java]]
=== Advanced Customizations with MVC Java Config === Advanced Customizations with MVC Java Config
As you can see from the above examples, MVC Java config and the MVC namespace provide As you can see from the above examples, MVC Java config and the MVC namespace provide