对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

消息转换器

您可以在 Java 配置中通过重写 configureMessageConverters() 来设置使用 HttpMessageConverter 个实例,以替换默认使用的实例。 您还可以通过重写 extendMessageConverters() 在末尾自定义已配置的消息转换器列表。spring-doc.cadn.net.cn

在 Spring Boot 应用程序中,WebMvcAutoConfiguration 除了添加默认的转换器外,还会添加它检测到的任何 HttpMessageConverter Bean。因此,在 Boot 应用程序中,建议使用 HttpMessageConverters 机制。或者,也可以使用 extendMessageConverters 方法在最后阶段修改消息转换器。

以下示例添加了 XML 和 Jackson JSON 转换器,并使用自定义的 ObjectMapper,而不是默认的转换器:spring-doc.cadn.net.cn

@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 用于为 MappingJackson2HttpMessageConverterMappingJackson2XmlHttpMessageConverter 创建通用配置,启用了缩进、自定义日期格式, 并注册了 jackson-module-parameter-names, 从而添加了访问参数名的支持(这是 Java 8 中新增的功能)。spring-doc.cadn.net.cn

该构建器对 Jackson 的默认属性进行了如下自定义:spring-doc.cadn.net.cn

如果在类路径中检测到以下知名模块,它还会自动注册这些模块:spring-doc.cadn.net.cn

启用带有 Jackson XML 支持的缩进功能,除了需要 jackson-dataformat-xml 依赖项外,还需要 woodstox-core-asl 依赖项。

还有其他有趣的 Jackson 模块可用:spring-doc.cadn.net.cn

以下示例展示了如何在 XML 中实现相同的配置:spring-doc.cadn.net.cn

<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"/>