Apache Shiro:Realm上的ClassCastException

时间:2016-04-20 16:53:40

标签: apache classcastexception shiro

好的,我正式感到困惑。

在Shiro,我有自己的领域(DatastoreRealm),它扩展了AuthorizingRealm。在我的DatastoreRealm中,我有方法" clearCachedAuthorizationInfo "这允许我在这些权限即时更改时清除用户权限等(然后重新检查)。

为了获得该方法,我必须能够访问我的 DatastoreRealm 对象。 我是按照以下方式做到的......

private static Realm lookupRealm(String realmName)  {
     SecurityManager securityManager = SecurityUtils.getSecurityManager();
     RealmSecurityManager realmSecurityManager = (RealmSecurityManager) securityManager;

     Collection<Realm> realms = realmSecurityManager.getRealms();
     for (Realm realm : realms) {
         if (realm.getName().equalsIgnoreCase(realmName)) {
             log.info("look up realm name is : " + realm.getName());
             return realm;
         }
     }
    return null; }

这似乎工作正常。它给我一个&#34; DatastoreRealm&#34;对象

虽然我称这种方法时,我不得不做以下事情......

 DatastoreRealm dsRealm =  (DatastoreRealm) lookupRealm("rfRealm");

引发&#34; ClassCastException &#34;告诉我......

rf.gae.DatastoreRealm cannot be cast to rf.gae.DatastoreRealm

如何/为何发生这种情况???

如果我不弃牌,只需使用&#34; 境界&#34;对象,&#34; clearCachedAuthorizationInfo &#34;我无法使用!

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

通过更多的挖掘,我发现了问题。

我正在使用的Web框架能够“热重新加载”类,这可以防止在每次代码更改时重新启动服务器。

这个问题是新的类加载器加载了编辑过的类,因此在尝试强制转换时,内存中的类不能转换为类加载器加载的新类!

对于要转换的类,它们必须属于同一类型,并由同一个类加载器加载。

关闭此功能可以纠正我的演员问题。