java - 使用来自共享类加载器的 EHCache 时出现 ClassCastException

标签 java tomcat ehcache

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

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

理想情况下,我希望只在 Tomcat 通用类加载器中共享 ehcache JAR 来执行此操作,据我所知,这应该是可能的。

我正在做的测试有两个 Web 服务,ServiceA 和 ServiceB,它们使用与 Tomcat 公共(public)库文件夹中的 EHCache JAR 相同的缓存。

当我向 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) {

最佳答案

这是 Ehcache 中的一个错误。

引用:https://jira.terracotta.org/jira/browse/EHC-976

在 2.6.2 版本中修复

关于java - 使用来自共享类加载器的 EHCache 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25727002/

相关文章:

java - ehcache 中可搜索的属性较多会降低缓存的性能吗?

java - 是否有新版本的 ehcache-core 是最新版本的 Ehcache 的一部分?

java - Libgdx 和谷歌 IAP

java - 如何使用 android facebook sdk 访问用户提要/帖子

java - 如何使用java中的colt库求解线性方程组

tomcat - 从 Intellij IDEA 11 运行 WEB Tomcat 应用程序时出错(CreateProcess error=87,参数不正确)

grails - Grails 1.3.4/Terracotta 3.5.1:部署.war文件失败

java - while 循环中仅打印一次语句

java - WebServlet - 带有两个字符的 urlPatterns

jsp - Tomcat中有没有目录权限设置来防止jsp运行?