java.sql.Time 字段使用 Jackson 进行序列化
java.sql.Time 字段使用 Jackson 进行序列化
java.sql.Time 字段使用 Jackson 进行反序列化
项目背景
情况:最近有一个很奇怪的事情,项目已经上线了一年有余,但这期间会出现几次时区问题。但是服务重启之后,时区问题便会消失。
架构:项目后端是 SpringBoot,前端是Vue。
问题分析
此时区问题是 java.sql.Time
字段 与 Mysql数据库 对应的表中 time字段相对小了 8小时
在实际代码中我已经 指定了时区 timezone = “GMT+8”
, 但还是出现了时区问题,我百思不得理解。
通过对源码的分析,我发现Jackson
对 java.sql.Time
字段序列化过程中默认使用系统默认时区,不支持指定时区。在系统运行过程中,默认时区的变化会导致时区问题。
Jackson
注解对 java.sql.Time
字段序列化并不支持指定时区,因此需要手动实现java.sql.Time
序列化,指定时区。
项目解决方案
对象部分代码:
import java.sql.Time;
private Time startTime;
实现类
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
/**
* 自定义 Time字段序列化
*
* @author
*/
public class SqlTimeSerializer extends JsonSerializer<Time> {
TimeZone sh = TimeZone.getTimeZone("Asia/Shanghai");
static String strTimeFormat = "HH:mm:ss";
static final SimpleDateFormat sdf = new SimpleDateFormat(strTimeFormat);
@Override
public void serialize(Time value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// 设置时区
sdf.setTimeZone(sh);
String strValue = sdf.format(value);
gen.writeString(strValue);
}
}
实体类中使用
@JsonSerialize(using = SqlTimeSerializer.class)
private Time startTime;