extendMessageConverters

extendMessageConverters

在 Spring Boot 中,MessageConverter 是用于将 HTTP 请求和响应的消息体转换为 Java 对象或将 Java 对象转换为 HTTP 消息体的组件。Spring Boot 提供了一些默认的 MessageConverter 实现,如 MappingJackson2HttpMessageConverter 用于 JSON 数据的转换。

扩展 MessageConverter

如果需要自定义或扩展 MessageConverter,可以通过实现 HttpMessageConverter 接口来创建自己的转换器。然后在 Spring Boot 的配置类中注册这个转换器。

以下是一个示例,演示如何扩展 Spring MVC 框架的消息转换器,以支持自定义的时间格式化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 扩展Spring MVC框架的消息转换器
* @param converters
*/
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("扩展Spring MVC框架的消息转换器...");
// 创建一个消息转换器对象
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 需要为消息转换器设置一个对象映射器
converter.setObjectMapper(new JacksonObjectMapper());
// 将自己的消息转换器加入到mvc框架的转换器集合中
// springboot本身已经添加了一些转换器,所以需要将自己的消息转换器放在最前面
converters.add(0, converter);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
*/
public class JacksonObjectMapper extends ObjectMapper {

public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
//public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

public JacksonObjectMapper() {
super();
//收到未知属性时不报异常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

//反序列化时,属性不存在的兼容处理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

//注册功能模块 例如,可以添加自定义序列化器和反序列化器
this.registerModule(simpleModule);
}
}

使用消息转换器和对象映射器的方式可以统一处理时间格式化问题,避免在每个实体类中都添加 @JsonFormat 注解。
这样可以提高代码的可维护性和可读性。
同时,使用 WebMvcConfigurer 还可以对其他请求和响应进行统一处理,例如添加全局异常处理、跨域配置等。