SpringBoot全局时间date和localDateTime格式失效问题记录
一、出参处理
springBoot项目中使用注解@ResponseBody或者@RestController默认使用Json格式返回数据。
默认返回的格式是这样的"2021-04-28T07:01:45.000+00:00",如下
我们可能想要返回给前端是yyyy-MM-dd HH:mm:ss 这样的格式
全局配置
若此配置无效,返回的时间还是上面那种中间带‘T’的那种格式的话,
解决方案
实现WebMvcConfigurer的extendMessageConverters方法
@Configuration
public class DateTimeSerializerConfig implements WebMvcConfigurer {
@Value("${spring.jackson.date-format}")
private String pattern;
/**
* 时间出参序列化
* 使用此方法, 以下 spring-boot: jackson时间格式化 配置 将会失效
* spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
* spring.jackson.time-zone=GMT+8
* 原因: 会覆盖 @EnableAutoConfiguration 关于 WebMvcAutoConfiguration 的配置
* */
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = converter.getObjectMapper();
// 时间格式化
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setDateFormat(new SimpleDateFormat(pattern));
// 设置格式化内容
converter.setObjectMapper(objectMapper);
converters.add(0, converter);
}
}
实现效果
返回的时间是自己定义的格式了
二、入参处理
当我们接收时间的类型是localDateTime类型时,前端传给我们的格式是
这样的yyyy-MM-dd HH:mm:ss
后端会报错Caused by: java.time.format.DateTimeParseException: Text '2021-06-11 14:02:40' could not be parsed at index 10
解决方案:
@Configuration
public class LocalDateTimeSerializerConfig {
@Value("${spring.jackson.date-format}")
private String pattern;
/**
* localDateTime入参转换
* @return
*/
@Bean
public ObjectMapper serializingObjectMapper() {
JavaTimeModule module = new JavaTimeModule();
LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
return Jackson2ObjectMapperBuilder.json().modules(module)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
}
}
三、出入参同时处理
前面一和二处理的时候,都是使用了ObjectMapper来处理的,但是两个的来源不一样的,两个同时存在时会优先继承WebMvcConfigurer的。另一个会失效。
究极处理方法:
@Configuration
public class DateTimeSerializerConfig implements WebMvcConfigurer {
@Value("${spring.jackson.date-format}")
private String pattern;
/**
* 时间处理
* 使用此方法, 以下 spring-boot: jackson时间格式化 配置 将会失效
* spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
* spring.jackson.time-zone=GMT+8
* 原因: 会覆盖 @EnableAutoConfiguration 关于 WebMvcAutoConfiguration 的配置
* */
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//localDateTime格式化
JavaTimeModule module = new JavaTimeModule();
LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
LocalDateTimeSerializer dateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
module.addSerializer(LocalDateTime.class, dateTimeSerializer);
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().modules(module)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
//date时间格式化
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setDateFormat(new SimpleDateFormat(pattern));
// 设置格式化内容
converter.setObjectMapper(objectMapper);
converters.add(0, converter);
}
}
完美解决入参出参date类型和localDateTime类型。
————————————————
版权声明:本文为CSDN博主「haixin_wu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42343505/article/details/117814346