Message Converters
你可以设置 HttpMessageConverter
实例在 Java 配置中使用,从而覆盖默认使用的实例,方法是覆盖https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html#configureMessageConverters-java.util.List-[configureMessageConverters()
]。你还可以通过覆盖https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html#extendMessageConverters-java.util.List-[extendMessageConverters()
] 来自定义配置的消息转换程序的最终列表。
在 Spring Boot 应用程序中,除默认转换器外, |
以下示例添加了一个 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"/>
在上一个示例中,将 SpringMVC 提供的https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.html[Jackson2ObjectMapperBuilder
] 用于给 MappingJackson2HttpMessageConverter
和 MappingJackson2XmlHttpMessageConverter
创建一个通用配置,同时启用缩进、自定义的日期格式,并注册https://github.com/FasterXML/jackson-module-parameter-names[jackson-module-parameter-names
],添加对访问参数名称的支持(此功能在 Java 8 中添加)。
此构建器按照以下方式自定义 Jackson 的默认属性:
-
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
is disabled. -
MapperFeature.DEFAULT_VIEW_INCLUSION
is disabled.
如果在类路径中检测到以下著名的模块,它还将自动注册这些模块:
-
jackson-datatype-joda:支持 Joda-Time 类型。
-
jackson-datatype-jsr310:支持 Java 8 日期和时间 API 类型。
-
jackson-datatype-jdk8:支持其他 Java 8 类型,例如
Optional
。 -
jackson-module-kotlin:支持 Kotlin 类和数据类。
启用 Jackson XML 支持的缩进需要 |
还提供其他有用的 Jackson 模块:
-
jackson-datatype-money:支持
javax.money
类型(非官方模块)。 -
jackson-datatype-hibernate:支持 Hibernate 专用类型和属性(包括惰性加载方面)。