IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis SpringCache——LocalDateTime导致 Java 8 date/time type `java.time.LocalDateTime` not supported -> 正文阅读

[大数据]Redis SpringCache——LocalDateTime导致 Java 8 date/time type `java.time.LocalDateTime` not supported

缓存序列化异常——LocalDateTime

前言

这个问题是我在使用SpringCache进行Redis序列化导致的问题,解决方法分为多个步骤,请大家仔细排查,错误产生方式可能不同

步骤

1.确认序列化

我们首先确认我们要进行序列化的数据,例如如下,我们要确定我们的类要实现Serializable接口,确保涉及到LocalDateTime的属性必须指定序列化和反序列化的注解,分别为

    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)

完整示例:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class KnowReposMenuTreeVO implements Serializable {
    @JsonSerialize(using = ToStringSerializer.class)
    private Long menuId;

    private String menuName;

    private String url;

    private String icon;

    private String author;

    private Integer orderNum;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime createTime;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime updateTime;

    private ArrayList<KnowReposMenuTreeVO> child;
}

2.确认数据库连接指定时区与我们序列化时区相同

我们可以看到,我还指定了一个序列化注解@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8"),这里我们指定了timezone也就是时区,指定为东八区!,那么我们的数据库连接时我们也要确保为东八区时间

url: jdbc:mysql://localhost:3306/routerboot_menu?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT+8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowPublicKeyRetrieval=true

或者你可以指定同为Asia/Shanghai这样指定城市
但这只是一个建议,因为根据我的测试,即使不同也不会影响

3.确认添加依赖

如下使用的是Jaskson序列化时间的依赖,建议加上,但即使加上你可能依然会报错,如果是这样请继续看下去

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

4.更改SpringCache的序列化器

以下代码是自定义的SpringCacheRedisConfig配置,对Redis的序列化键值方式进行修改,键使用了StringRedisSerializer(),值则使用了GenericFastJsonRedisSerializer()这是FastJson2的Redis序列化方式,根据我的测试,原先我使用的是GenericJackson2JsonRedisSerializer性能上比较低,接口首次访问序列化整体时间约3s,修改后平均为700ms,性能提升近5倍

//@ConfigurationProperties(prefix = "spring.cache")
//CacheProperties.class
@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class RWRedisConfig {
    

    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer()));
       //获取redis配置
        final CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:22:42  更:2022-09-13 11:24:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:43:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码