如何解决使用WebSphere DynaCache时出现的DistributedMap类转换异常
类转换异常修复方案
根因说明
该异常是OSGi环境下的类加载器隔离冲突导致:WebSphere服务器提供的com.ibm.ws.cache.DistributedMapImpl实现类由服务器公共类加载器加载,而你的OSGi应用中引入的com.ibm.websphere.cache.DistributedMap接口由应用独立的OSGi类加载器加载,JVM会判定两个类不属于同一运行时上下文,因此强转失败。
可行修复步骤
- 移除应用内自带的WebSphere缓存API依赖:不要在OSGi bundle的内置依赖、
WEB-INF/lib目录下打包包含com.ibm.websphere.cache接口的jar包,该API由WebSphere 9.0环境默认提供。 - 调整OSGi bundle的包导入配置:在
MANIFEST.MF文件中添加如下配置,明确声明该接口包由服务器父类加载器导入:
版本范围可匹配你当前WAS 9.0.0.11自带的API版本,无特殊需求直接使用上述范围即可。Import-Package: com.ibm.websphere.cache;version="[1.1.0,2.0.0)" - 确认服务器缓存实例配置:登录WAS管理控制台,依次进入
服务 > 缓存实例 > 分布式对象缓存实例,确认JNDI名称为services/cache/distributedmap的默认实例处于启用状态,且实例对应的类加载器策略设置为父类优先。 - 可选兜底适配逻辑:如果配置调整后仍有兼容问题,可调整lookup逻辑适配类加载上下文:
private DistributedMap mapobj = null; try { InitialContext ctx = new InitialContext(); Object cacheObj = ctx.lookup("services/cache/distributedmap"); // 用服务器类加载器加载接口后做实例校验 Class<?> distMapClass = cacheObj.getClass().getClassLoader().loadClass("com.ibm.websphere.cache.DistributedMap"); if (distMapClass.isInstance(cacheObj)) { mapobj = (DistributedMap) cacheObj; mapobj.enableListener(true); } } catch (NamingException | ClassNotFoundException e) { System.err.println(e.getMessage()); }
内容的提问来源于stack exchange,提问作者Subhopriyo
相关产品推荐
相关产品推荐

