消息转换器
您可以通过重写 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:在默认注册的转换器列表末尾追加自定义转换器,或对现有转换器进行微调。