消息转换器

您可以通过覆盖configureMessageConverters()方法,在Java配置中设置要使用的HttpMessageConverter实例,以替换默认使用的实例。您还可以通过覆盖extendMessageConverters()方法来自定义配置的消息转换器列表。

在Spring Boot应用程序中,WebMvcAutoConfiguration会添加检测到的任何HttpMessageConverter bean,除了默认的转换器。因此,在Boot应用程序中,建议使用HttpMessageConverters机制。或者,使用extendMessageConverters在最后修改消息转换器。

以下示例使用自定义的ObjectMapper添加XML和Jackson JSON转换器,而不是使用默认的转换器:

  • 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创建了一个通用配置,用于MappingJackson2HttpMessageConverterMappingJackson2XmlHttpMessageConverter,启用了缩进,自定义日期格式,并注册了jackson-module-parameter-names,该模块添加了对访问参数名称的支持(这是Java 8中添加的功能)。

此构建器自定义了Jackson的默认属性如下:

如果在类路径上检测到以下知名模块,它还会自动注册这些模块:

启用Jackson XML支持的缩进需要在woodstox-core-asl依赖项中添加,除了jackson-dataformat-xml

还有其他有趣的Jackson模块可用:

以下示例展示了如何在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"/>