Skip to content

消息转换器

在响应式栈中查看等效项

您可以通过重写 configureMessageConverters() 来配置要使用的 HttpMessageConverter 实例。

以下示例配置了自定义的 Jackson JSON 和 XML 转换器,并使用了自定义的映射器(Mappers)而非默认映射器:

java
@Configuration
public class WebConfiguration implements WebMvcConfigurer {

	@Override
	public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) {
		JsonMapper jsonMapper = JsonMapper.builder()
				.findAndAddModules()
				.enable(SerializationFeature.INDENT_OUTPUT)
				.defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd"))
				.build();
		XmlMapper xmlMapper = XmlMapper.builder()
				.findAndAddModules()
				.defaultUseWrapper(false)
				.build();
		builder.withJsonConverter(new JacksonJsonHttpMessageConverter(jsonMapper))
				.withXmlConverter(new JacksonXmlHttpMessageConverter(xmlMapper));
	}
}
kotlin
@Configuration
class WebConfiguration : WebMvcConfigurer {

	override fun configureMessageConverters(builder: HttpMessageConverters.ServerBuilder) {
		val jsonMapper = JsonMapper.builder()
			.findAndAddModules()
			.enable(SerializationFeature.INDENT_OUTPUT)
			.defaultDateFormat(SimpleDateFormat("yyyy-MM-dd"))
			.build()
		val xmlMapper = XmlMapper.builder()
			.findAndAddModules()
			.defaultUseWrapper(false)
			.build()
		builder.withJsonConverter(JacksonJsonHttpMessageConverter(jsonMapper))
			.withXmlConverter(JacksonXmlHttpMessageConverter(xmlMapper))
	}
}

补充教学

1. HttpMessageConverter 的作用

它是 Spring MVC 处理 HTTP 请求和响应的核心。

  • 请求时:将请求体(如 JSON 字符串)转换为对象(用于 @RequestBody)。
  • 响应时:将对象转换为响应体(如 JSON/XML,用于 @ResponseBody)。

2. 为什么要自定义 Mapper?

  • 日期格式化:通过 defaultDateFormat 统一日期的 JSON 输出格式(如 yyyy-MM-dd)。
  • 美化输出SerializationFeature.INDENT_OUTPUT 会在 JSON 中添加缩进,方便调试(生产环境通常关闭以节省带宽)。
  • 模块自动发现.findAndAddModules() 会自动注册如 Java 8 时间模块(JSR310)等扩展,避免日期转换报错。

3. configure vs extend

  • configureMessageConverters:一旦设置,会覆盖 Spring 默认注册的所有转换器。
  • extendMessageConverters:在默认注册的转换器列表末尾追加自定义转换器,或对现有转换器进行微调。

Based on Spring Framework.