【问题标题】:Apache Shiro: ClassCastException on RealmApache Shiro:领域上的 ClassCastException
【发布时间】:2016-08-13 12:26:33
【问题描述】:

好吧,我很困惑。

在 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; }

这似乎工作正常。它返回一个“DatastoreRealm”对象。

虽然当我调用这个方法的时候,我不得不做以下事情……

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

这会引发“ClassCastException”告诉我...

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

这是如何/为什么会发生的???

如果我不投射,而只是使用“Realm”对象,则“clearCachedAuthorizationInfo”对我不可用!

提前感谢您的帮助!

【问题讨论】:

    标签: apache classcastexception shiro


    【解决方案1】:

    好吧,通过更多的挖掘,我发现了问题所在。

    我正在使用的 Web 框架能够“热重载”类,从而避免在每次代码更改时都必须重新启动服务器。

    这样做的问题是新的类加载器会加载已编辑的类,因此当尝试进行转换时,内存中的类无法转换为类加载器加载的新类!

    对于要强制转换的类,它们必须是相同的类型并由相同的类加载器加载。

    关闭此功能更正了我的投射问题。

    【讨论】:

    • 老话题但是:你能不能这么好心,分享一下你用的什么框架?你是如何禁用“热重载”的?
    猜你喜欢
    • 2012-11-06
    • 2018-03-14
    • 2015-05-31
    • 2011-06-18
    • 2018-01-25
    • 1970-01-01
    • 2016-03-12
    • 2012-01-12
    • 2014-02-13
    相关资源
    最近更新 更多