2016-04-20 7 views
1

Хорошо, я официально смущен.Apache Shiro: ClassCastException on Realm

В Сиро у меня есть собственное царство (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» не доступен для меня!

Заранее благодарим за помощь!

ответ

0

Ну что ж, еще немного выкапывая, я понял проблему.

Веб-фреймворк, который я использую, имеет возможность «горячей перезагрузки» классов, которая препятствует перезагрузке сервера при каждом изменении кода.

Проблема в том, что новый загрузчик классов загружает отредактированный класс, и, таким образом, при попытке броска класс в памяти не может быть перенесен в новый класс, загруженный загрузчиком классов!

Для классов, которые должны быть отлиты, они должны быть одного типа и загружаться одним и тем же загрузчиком классов.

Отключение этой функции устраняет мою проблему с литьем.

+0

Старая тема, но: Не могли бы вы быть добрыми и поделиться, какие рамки вы использовали? И как вы отключили «горячую перезагрузку»? – PastorPL

 Смежные вопросы

  • Нет связанных вопросов^_^