在项目中从redis获取带有LocalDateTime类型属性的对象时出现了以下异常:
go
"createTime": {
"dayOfYear":141,
"dayOfWeek":"WEDNESDAY",
"month":"MAY",
"dayOfMonth":20,
"year":2020,
"monthValue":5,
"hour":19,
"minute":50,
"second":47,
"nano":364000000,
"chronology":{
"calendarType":"iso8601",
"id":"ISO"
}
}
这是因为我们将数据存入redis时,Jackson默认将LocalDateTime类型序列化为对象形式存储
网上的方案是
两种方案
- 全局配置 时间类型 序列化
- 在实体类上打注解
// @JsonDeserialize(using = LocalDateTimeDeserializer.class)
// @JsonSerialize(using = LocalDateTimeSerializer.class)
打注解太麻烦了
- 全局配置方案 项目中配置了 但是 还是没解决 不知道哪里出了问题
下面是我搜的 博客地址 大家可以参考一下
https://blog.csdn.net/weixin_41291118/article/details/123087974
我根据博客 配置了 redisConfig 但是没解决问题
我觉得是可以用的 有可能是我项目中 哪里 影响到了配置
所以最终根据网上的 方案我没成功
我就直接放弃了 使用 Jackson 这个类来序列化
在存 取 redis 数据的时候 用 fastjson 来处理 这样存进去的 LocalDateTime 类型 就是字符串了 就不是对象了
JSONObject.toJSONString 和 JSONObject.parseObject
go
public static <T> T getString(String key, Class<T> valueType) {
String value = (String) redisTemplate.opsForValue().get(key);
if (StringUtils.isEmpty(value)) {
return null;
}
return JSONObject.parseObject(value, valueType);
}
public static void delString(String key) {
redisTemplate.delete(key);
}
public static <T> Boolean setString(String key, T value, long time, TimeUnit unit) {
String valueStr = JSONObject.toJSONString(value);
redisTemplate.opsForValue().set(key, valueStr);
if (time > 0) {
redisTemplate.expire(key, time, unit);
}
return true;
}
public static <T> Boolean setString(String key, T value, long time) {
String valueStr = JSONObject.toJSONString(value);
redisTemplate.opsForValue().set(key, valueStr);
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
}