在Wildfly 8.2上重新部署后从Infinispan Cache读取时出现ClassCastException

时间:2015-05-27 13:05:18

标签: java java-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中查找Cache,如下所示:

@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尝试转换使用前一个类加载器存储的实体,该实体无法工作。但是如何避免这种情况?

2 个答案:

答案 0 :(得分:2)

不要使用start =&#34; EAGER&#34;。这将解决您的问题。 我们已经从WildFly 9中删除了它,因为它的误用是许多用户头痛的根源。

另外,我建议直接注入缓存(而不仅仅是缓存容器)。这样,缓存生命周期将绑定到部署的生命周期。 e.g。

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

最后,请随意使用resource-ref以避免在应用程序中引用特定于供应商的jndi名称空间。

答案 1 :(得分:0)

如果在Infinispan配置中启用store-as-binary并强制缓存使用应用程序的类加载器而不是GlobalConfiguration中的类加载器,则应该能够共享缓存:

Cache appSpecificCache = cacheFromJndi.getAdvancedCache().with(applicationClassLoader)