Java8中对于LocalDateTime的序列化和反序列化问题
作者:刘元涛 时间:2023-11-14 15:37:41
Java8对于LocalDateTime的序列化和反序列化
这里以jackjson为例
配置反序列化工具
/**
* 时间戳反序列化时间
*
* @author liuyuantao
*/
public class Str2LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
private static final String STANDARD_PATTERN = "yyyy-MM-dd HH:mm:ss";
@Override
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
DateTimeFormatter formatterDateTime = DateTimeFormatter.ofPattern(STANDARD_PATTERN);
String timeStr = jsonParser.getValueAsString();
return LocalDateTime.parse(timeStr, formatterDateTime);
}
}
解决1:
配置全局日期格式化
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
private String pattern;
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
//返回时间数据序列化
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
//接收时间数据反序列化
builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
};
}
}
解决2:
在LocalDateTime 实体类使用注解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime issueDate;
springboot添加LocalDateTime等java8时间类序列化和反序列化的支持
由于项目将原有的 Date类型的字段改造为 LocalDate,LocalDateTime,LocalTime 类型, 发现 spring 对项目的时间格式无法自动转换,故需手动配置下。
在spring boot 中需在 maven 中引入 jsr-310 的支持
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
或者直接引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
因为 spring boot 是使用 jackson 作为 json 序列化和反序列化工具的,故只需配置 jackson 即可。
配置如下:
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addSerializer(LocalDate.class,new LocalDateSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_FORMAT)));
javaTimeModule.addSerializer(LocalTime.class,new LocalTimeSerializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDate.class,new LocalDateDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_FORMAT)));
javaTimeModule.addDeserializer(LocalTime.class,new LocalTimeDeserializer(DateTimeFormatter.ofPattern(Constants.DEFAULT_TIME_FORMAT)));
objectMapper.registerModule(javaTimeModule).registerModule(new ParameterNamesModule());
return objectMapper;
}
}
public class Constants {
/** 默认日期时间格式 */
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/** 默认日期格式 */
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
/** 默认时间格式 */
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
}
然后只需要在实体类中对应的时间类型上使用 @DateTimeFormat 和 @JsonFormat 即可。
来源:https://blog.csdn.net/u013510614/article/details/122451918
标签:Java8,LocalDateTime,序列化,反序列化
0
投稿
猜你喜欢
Java装饰者模式的示例详解
2022-03-30 07:26:22
Java面向对象编程(封装/继承/多态)实例解析
2023-11-11 11:33:09
spring mvc实现登录账号单浏览器登录
2022-06-28 22:29:47
C#使用struct直接转换下位机数据的示例代码
2023-06-07 01:49:01
spring boot自带图片服务器使用详解
2021-11-07 07:49:39
Java 基于tcp协议实现文件上传
2022-04-14 04:01:29
Java中的同步与异步详细介绍
2023-06-23 00:42:08
Android中WebView用法实例分析
2023-03-20 17:02:51
SpringBoot使用Thymeleaf自定义标签的实例代码
2023-11-24 21:41:29
本地jvm执行flink程序带web ui的操作
2022-09-03 20:49:00
老生常谈反射之Class类的使用(必看篇)
2022-07-20 16:32:30
10种简单的Java性能优化
2023-06-20 20:43:41
Android重写View实现全新的控件
2021-08-11 21:49:39
Java语言求解完美数代码分析
2023-01-28 10:17:58
java后台实现支付宝对账功能的示例代码
2021-10-29 22:15:29
spring boot项目打包成war在tomcat运行的全步骤
2023-12-17 19:20:36
Java本地缓存的实现代码
2022-02-22 11:21:04
Java中实现线程间通信的实例教程
2021-10-12 17:33:30
kotlin源码结构层次详解
2022-08-19 14:24:48
Java微信授权登陆的实现示例
2021-12-11 22:03:04