Spring Redis 缓存中的 ClassCastException
ClassCastException in Spring Redis Cache
我正在使用 Spring 引导版本 2.1.8.RELEASE 开发 Spring 引导应用程序。
我需要构建自定义 RedisCacheManager。
RedisCacheManager如下
@EnableCaching
@Configuration
class CacheConfig {
@Bean
fun redisCacheManager(lettuceConnectionFactory: RedisConnectionFactory): RedisCacheManager? {
val redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1))
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(lettuceConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build()
}
}
在我的服务中,我使用@Cacheble 缓存响应。参见:
@Cacheable(cacheNames = ["cached_sample"])
fun getAllSample(): List<SampleRecord> {
return auditableRepository.findAll()
}
我缓存的模型:
data class SampleRecord(
@ApiModelProperty(readOnly = true)
val id: Long? = null,
@ApiModelProperty(readOnly = true)
val active: Boolean? = null,
@ApiModelProperty(readOnly = true)
val createdDate: Instant? = null,
val param: String
): Serializable
当我第二次调用函数时,出现以下异常
Caused by: java.lang.ClassCastException: com.cryptocurrency.exchange.sample.model.SampleRecord cannot be cast to com.cryptocurrency.exchange.sample.model.SampleRecord
这个异常的原因是什么?
如果您在依赖关系树中 Spring 开发工具,则会出现此问题。有一个相当简单的解决方案,但没有很好地记录。您需要设置 Redis 缓存配置以在反序列化对象时引用 Context 类加载器。对于您的代码,它看起来像:
redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig(Thread.currentThread().getContextClassLoader())
.entryTtl(Duration.ofHours(1))
.defaultCacheConfig(Thread.currentThread().getContextClassLoader()) 确保 Redis 在反序列化时具有对 Context 类加载器的引用。 Spring 在此处的已知问题部分对此进行了概述:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools-known-restart-limitations
我正在使用 Spring 引导版本 2.1.8.RELEASE 开发 Spring 引导应用程序。 我需要构建自定义 RedisCacheManager。
RedisCacheManager如下
@EnableCaching
@Configuration
class CacheConfig {
@Bean
fun redisCacheManager(lettuceConnectionFactory: RedisConnectionFactory): RedisCacheManager? {
val redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1))
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(lettuceConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build()
}
}
在我的服务中,我使用@Cacheble 缓存响应。参见:
@Cacheable(cacheNames = ["cached_sample"])
fun getAllSample(): List<SampleRecord> {
return auditableRepository.findAll()
}
我缓存的模型:
data class SampleRecord(
@ApiModelProperty(readOnly = true)
val id: Long? = null,
@ApiModelProperty(readOnly = true)
val active: Boolean? = null,
@ApiModelProperty(readOnly = true)
val createdDate: Instant? = null,
val param: String
): Serializable
当我第二次调用函数时,出现以下异常
Caused by: java.lang.ClassCastException: com.cryptocurrency.exchange.sample.model.SampleRecord cannot be cast to com.cryptocurrency.exchange.sample.model.SampleRecord
这个异常的原因是什么?
如果您在依赖关系树中 Spring 开发工具,则会出现此问题。有一个相当简单的解决方案,但没有很好地记录。您需要设置 Redis 缓存配置以在反序列化对象时引用 Context 类加载器。对于您的代码,它看起来像:
redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig(Thread.currentThread().getContextClassLoader())
.entryTtl(Duration.ofHours(1))
.defaultCacheConfig(Thread.currentThread().getContextClassLoader()) 确保 Redis 在反序列化时具有对 Context 类加载器的引用。 Spring 在此处的已知问题部分对此进行了概述:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools-known-restart-limitations