消息转换器
你可以通过重写 configureMessageConverters() 来设置 Java 配置中使用的 HttpMessageConverter
实例,从而替换默认使用的转换器。你也可以通过重写 extendMessageConverters() 在最后自定义已配置的消息转换器列表。
在 Spring Boot 应用程序中,WebMvcAutoConfiguration
除了默认的转换器外,还会添加它检测到的任何 HttpMessageConverter
bean。因此,在 Boot 应用程序中,建议使用 HttpMessageConverters 机制。或者,也可以使用 extendMessageConverters
在最后阶段修改消息转换器。
以下示例添加了 XML 和 Jackson JSON 转换器,并使用自定义的 ObjectMapper
替换默认的转换器:
- Java
- Kotlin
- Xml
@Configuration
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
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()))
}
}
<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"/>
在前面的示例中,Jackson2ObjectMapperBuilder 被用来为 MappingJackson2HttpMessageConverter
和 MappingJackson2XmlHttpMessageConverter
创建一个通用的配置,启用了缩进、自定义日期格式,并注册了 jackson-module-parameter-names,该模块增加了对访问参数名称的支持(这是 Java 8 中添加的一个功能)。
此构建器按如下方式自定义 Jackson 的默认属性:
如果检测到类路径中存在以下众所周知的模块,它也会自动注册它们:
-
jackson-datatype-jsr310: 支持 Java 8 日期和时间 API 类型。
-
jackson-datatype-jdk8: 支持其他 Java 8 类型,例如
Optional
。 -
jackson-module-kotlin: 支持 Kotlin 类和数据类。
启用 Jackson XML 支持的缩进功能除了需要 jackson-dataformat-xml 依赖外,还需要 woodstox-core-asl 依赖。
其他有趣的 Jackson 模块包括:
-
jackson-datatype-money: 支持
javax.money
类型(非官方模块)。 -
jackson-datatype-hibernate: 支持 Hibernate 特定的类型和属性(包括懒加载方面)。