Redis缓存启动报错:ClassNotFoundException: [Lxyz.property.model.CouncilTax;
问题
我有一个基于Quarkus框架、使用Redis缓存的方法,代码如下:
@CacheResult(cacheName = "council-tax-bands-by-postcode") @Query("searchCouncilTaxBandByPostcode") @Blocking public Uni<CouncilTax[]> searchByPostcode(CouncilTaxSearchCriteria searchCriteria) { log.infof("Searching council tax bands for postcode: %s", searchCriteria.getPostcode()); return scraper.getByPostcode(searchCriteria).memoize().indefinitely(); }
启动应用时出现如下错误:
Caused by: java.lang.ClassNotFoundException: [Lxyz.property.model.CouncilTax; at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:518) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:468) at io.quarkus.cache.redis.runtime.RedisCacheImpl.loadClass(RedisCacheImpl.java:109)
改用Caffeine内存缓存则运行正常。我尝试在应用配置中设置:
#Cache settings quarkus.cache.redis.expensiveResourceCache.key-type=java.lang.String quarkus.cache.redis.expensiveResourceCache.value-type=xyz.property.model.CouncilTax
但仍出现相同错误,请问我遗漏了什么?
解决方案
缓存名称配置不匹配
代码中@CacheResult指定的缓存名称是council-tax-bands-by-postcode,但你配置里用的是expensiveResourceCache,两者完全不对应。Redis缓存的配置项必须和注解中的cacheName一致,把配置里的expensiveResourceCache替换成council-tax-bands-by-postcode。值类型需要指定为数组类型
方法返回的是Uni<CouncilTax[]>,也就是CouncilTax数组,错误日志里的[Lxyz.property.model.CouncilTax;正是数组类的JVM标识。所以配置的value-type不能只写xyz.property.model.CouncilTax,要改成数组的全限定名:xyz.property.model.CouncilTax[]。确认类的访问权限
确保xyz.property.model.CouncilTax类是public修饰的,Quarkus的类加载器需要能正常加载这个类,如果类是包私有或受保护的,会导致加载失败出现ClassNotFoundException。
调整后的正确配置如下:
#Cache settings quarkus.cache.redis.council-tax-bands-by-postcode.key-type=java.lang.String quarkus.cache.redis.council-tax-bands-by-postcode.value-type=xyz.property.model.CouncilTax[]
内容的提问来源于stack exchange,提问作者Simone Di Cola
相关产品推荐
相关产品推荐

