引言
关于使用雪花算法作为主键id生成, 19位数return给前端出现数据失真, 导致id与数据库中不对应, 极有可能出现缓存穿透问题
更多可参考github项目官网解决问题, 也可直接传送到Jackson文档
解决方法
问题
浏览器开发者模式看到的接口返回数据, 此ID为失真状态的value
postman中测试的接口真实ID为正确的value
数据库中对比下来
解决
使用了@JsonFormat注解解决失真问题
/**
* DTO实体
*/
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long id;
官方文档这样对此做出解释
JsonFormat: 具有每种类型行为的一般注释;例如,可用于指定序列化日期/时间值时使用的格式
JsonFormat
JsonFormat主要还用于DTO格式化时间
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, locale = “zh”, timezone = “GMT+8”)
参数说明
-
pattern 指定转化的格式SSSZ(S指的是微秒,Z指时区),此处的pattern和java.text.SimpleDateFormat中的Time Patterns一致
-
locale主要指语言,如果中文的话,月份输出是五月,但是英文就是May,尤其是在反序列化的时候特别重要
-
timezone主要解决“8小时”问题
copy文档示例
Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text Tuesday; Tue
u Day number of week (1 = Monday, …, 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00