|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
消息转换器
您可以通过覆盖configureMessageConverters(),
在Java配置中设置要使用的HttpMessageConverter实例以替换默认使用的实例。
您还可以通过覆盖extendMessageConverters(),
在最后自定义已配置的消息转换器列表。
在Spring Boot应用程序中,WebMvcAutoConfiguration除了默认转换器外,还会添加它检测到的所有
HttpMessageConverter beans。因此,在Boot应用程序中,建议优先使用
HttpMessageConverters
机制。或者,您也可以使用extendMessageConverters在最后阶段修改消息转换器。 |
以下示例添加了XML和Jackson JSON转换器,并使用自定义的ObjectMapper代替默认的转换器:
-
Java
-
Kotlin
@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {
@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.createXmlMapper(true).build()));
}
}
@Configuration
@EnableWebMvc
class WebConfiguration : WebMvcConfigurer {
override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
val builder = Jackson2ObjectMapperBuilder()
.indentOutput(true)
.dateFormat(SimpleDateFormat("yyyy-MM-dd"))
.modulesToInstall(ParameterNamesModule())
converters.add(MappingJackson2HttpMessageConverter(builder.build()))
converters.add(MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()))
在前面的例子中,
Jackson2ObjectMapperBuilder
用于为 MappingJackson2HttpMessageConverter 和 MappingJackson2XmlHttpMessageConverter 创建一个通用配置,启用缩进、自定义日期格式,并注册
jackson-module-parameter-names,
这添加了对访问参数名称的支持(Java 8 中新增的功能)。
此构建器按如下方式自定义Jackson的默认属性:
它还会自动注册以下知名模块,如果在类路径上检测到它们:
-
jackson-datatype-joda: 支持Joda-Time类型。
-
jackson-datatype-jsr310: 支持Java 8日期和时间API类型。
-
jackson-datatype-jdk8: 支持其他Java 8类型,如
Optional。 -
jackson-module-kotlin: 对Kotlin类和数据类的支持。
启用Jackson XML支持的缩进需要
woodstox-core-asl
个依赖项,除了 jackson-dataformat-xml 之外。 |
还有其他有趣的 Jackson 模块可供使用:
-
jackson-datatype-money: 对
javax.money类型的支持(非官方模块)。 -
jackson-datatype-hibernate: 支持Hibernate特有的类型和属性(包括懒加载方面)。
以下示例展示了如何在XML中实现相同的配置:
<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"/>