Spring Caching 的 AbstractCacheInvoker doPut() 方法错误调用 RedisCache put() 方法

Posted

技术标签:

【中文标题】Spring Caching 的 AbstractCacheInvoker doPut() 方法错误调用 RedisCache put() 方法【英文标题】:Spring Caching's AbstractCacheInvoker doPut() method calls RedisCache put() method by mistake 【发布时间】:2021-12-16 23:30:22 【问题描述】:

我有一个用 Spring Boot 编写的 Web 应用程序,它使用 springframework.cache,在我开始使用 spring-data-redis 之前一切正常。

只要我在 pom.xml 中添加 spring-data-redis,我的 spring 缓存就会开始使用 RedisCache 实现。我想将 redis 用于不同事物的 redis 流部分,并以某种方式忽略应用程序缓存部分的 redis 缓存实现

例外类路径:

java.io.NotSerializableException: ...DomainData
assessment-service_1  |         at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:96)
assessment-service_1  |         at org.springframework.data.redis.serializer.DefaultRedisElementWriter.write(DefaultRedisElementWriter.java:43)
assessment-service_1  |         at org.springframework.data.redis.serializer.RedisSerializationContext$SerializationPair.write(RedisSerializationContext.java:287)
assessment-service_1  |         at org.springframework.data.redis.cache.RedisCache.serializeCacheValue(RedisCache.java:244)
assessment-service_1  |         at org.springframework.data.redis.cache.RedisCache.put(RedisCache.java:150)
assessment-service_1  |         at org.springframework.cache.interceptor.AbstractCacheInvoker.doPut(AbstractCacheInvoker.java:87)
assessment-service_1  |         at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.apply(CacheAspectSupport.java:837)
assessment-service_1  |         at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:430)
assessment-service_1  |         at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:346)
assessment-service_1  |         at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)
assessment-service_1  |         at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
assessment-service_1  |         at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
assessment-service_1  |         at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)

【问题讨论】:

【参考方案1】:

您可能希望显式设置属性spring.cache.type,如果检测到 Spring Data Redis,它会自动配置为使用 Redis。您可以从https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/cache/CacheType.html 中选择值或使用“无”完全禁用。您可能需要将 spring-boot-starter-cache 添加到您的 POM 以获取基本的缓存实现。

【讨论】:

好的,谢谢您的回答。这正是我所做的。我指定它使用 SIMPLE(简单内存缓存),并且它工作正常。

以上是关于Spring Caching 的 AbstractCacheInvoker doPut() 方法错误调用 RedisCache put() 方法的主要内容,如果未能解决你的问题,请参考以下文章

REDIS12_Spring Cache概述@Cacheable@CacheEvict@Caching@CachePut的使用

Spring Caching 的 AbstractCacheInvoker doPut() 方法错误调用 RedisCache put() 方法

Spring Boot Caching with Redis - 反序列化问题

Spring Boot Caching with Redis and Store value as Redis Hash

错误 java.sql.SQLException:在创建 Spring Boot 应用程序期间无法加载身份验证插件“caching_sha2_password”

spring 中的 abstract="true" 是啥意思?