从共享类加载器使用EHCache时出现ClassCastException

时间:2014-09-08 14:46:57

标签: java tomcat ehcache

我试图设置一个EHCache,用于在同一个Tomcat实例上运行的各种WAR文件。

我正在缓存的对象是自定义java bean。我正在使用EHCache版本2.8.3

理想情况下,我只想在Tomcat公共类加载器中共享ehcache JAR,并且我已经阅读过这应该是可能的。

我正在进行的测试有两个Web服务,ServiceA和ServiceB,它们使用相同的缓存,因为EHCache JAR位于Tomcat common lib文件夹中。

当我使用ServiceA发出请求时,生成的对象已成功插入到缓存中。

当我使用ServiceB发出相同的请求时,会从缓存中成功检索生成的对象。

但是,当我返回ServiceA并发出请求时,它会抛出ClassCastException

<faultcode>S:Server</faultcode>
 <faultstring>com.company.platform.auth.user.AuthenticatedUser cannot be cast to com.company.platform.auth.user.AuthenticatedUser</faultstring>

EHCache文档建议我应将copyOnRead属性设置为true,以确保缓存始终使用序列化。但是,添加此内容对我来说似乎没有用

http://terracotta.org/documentation/3.7.4/enterprise-ehcache/configuration-guide#copy-on-read

缓存配置:

<cache name="myCache"
       maxElementsInMemory="2000"
       copyOnRead="true"
       copyOnWrite="true"
       eternal="false"
       overflowToDisk="false"
       timeToIdleSeconds="0"
       timeToLiveSeconds="3600"
       memoryStoreEvictionPolicy="LFU"
       transactionalMode="off"
/>

使用方法上的Spring @Cacheable注释来管理缓存数据:

@Cacheable(
        value=CACHE_NAME, 
        key="#username + ':' + T(com.company.platform.auth.handlers.EncryptionHandler).encrypt(#password)",
        unless="#result == null")
public AuthenticatedUser authenticate(String username, String password) {

1 个答案:

答案 0 :(得分:0)

这是Ehcache的一个错误。

参考:https://jira.terracotta.org/jira/browse/EHC-976

在2.6.2版本中修复了