java - 在 Wildfly 8.2 上重新部署后从 Infinispan 缓存读取时发生 ClassCastException

标签 java jakarta-ee wildfly classcastexception infinispan

我在 Wildfly 8.2 上有一个简单的 Infinispan 本地缓存(也尝试过分布式缓存)。一切正常,直到我重新部署我的 .WAR。重新部署我的 .WAR 后,出现以下错误:

Caused by: java.lang.ClassCastException: my.package.MyClass cannot be cast to my.package.MyClass

完整堆栈跟踪:https://gist.github.com/bagges/07af1842a874f7c99ef3

我像这样在 CDI Bean 中查找缓存:

@Path("/mypath")
@Stateless
public class MyServiceClass {

    @Resource(lookup = "java:jboss/infinispan/myContainer")
    private CacheContainer container;

    private Cache<Integer, MyCacheObject> myCache;

    @PostConstruct
    public void start() {
        myCache = container.getCache("myCache");
    }

    @GET
    public String get() {
        if(!myCache.containsKey(1)) {
            myCache.put(1, new MyCacheObject(1, "Hello Cache"));
        }
        return myCache.get(1).getName();
    }
}

Wildfly 配置:

<cache-container name="myContainer" jndi-name="java:jboss/infinispan/myContainer" start="EAGER">
    <local-cache name="myCache"/>
</cache-container>

我知道错误发生是因为关闭了不同的类加载器。 Infinispan 尝试转换存储在先前无法工作的类加载器中的实体。但是如何避免呢?

最佳答案

不要使用 start="EAGER"。那将解决您的问题。 我们已将其从 WildFly 9 中删除,因为它的滥用一直是许多用户头痛的根源。

此外,我建议直接注入(inject)您的缓存(而不仅仅是缓存容器)。这样,缓存生命周期将绑定(bind)到部署的生命周期。 例如

@Resource(lookup = "java:jboss/infinispan/cache/myContainer/myCache")
private Cache<Integer, MyCacheObject> myCache;

最后,请随意使用资源引用以避免在您的应用程序中引用特定于供应商的 jndi 命名空间。

关于java - 在 Wildfly 8.2 上重新部署后从 Infinispan 缓存读取时发生 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30483372/

相关文章:

java - 尝试比较两个元素时出错 (Java)!

java - 无法检查数组中的所有元素

java - 通过 AsyncTask 循环执行方法 - Android?

java - 将堆栈跟踪重定向到日志文件而不是控制台输出?

java - 使用 org.jboss.dmr.ModelNode 更改数据源属性

java - 结果集未打开。不允许操作 'getString'。验证自动提交是否已关闭。

java - 如何在 WAR 文件中添加 weblogic-application.xml

java - 如何在 Wildfly 中将外部属性文件加载到 Spring Boot

java - Jboss 上的 Logback 在记录时重复前缀和新行

java - 构造 ObjectInputStream 时出现 EOFException