Apache Shiro + Guice - не могу заставить работать аннотации

Так что я смог заставить Apache Shiro работать с Guice (благодаря ShiroWebModule) на Vaadin. Аннотации Широ (@RequiresAuthentication, @RequiresPermission) работают только в основном классе приложения Vaadin и внутри пользовательских классов. Они не работают внутри классов CustomComponent/Window.

Я попытался внедрить классы Window в класс Application с провайдерами через injector.getInstance, и это все еще не работает...

Я новичок в Guice и Shiro, так что, может быть, я что-то упускаю?

Почему это работает для других пользовательских классов? Это работает, как и ожидалось (выдает исключение)

public class TestClassImpl implements TestClass {

    @Override

    public void doSomeWork() {
        //this will throw an exception as expected
        test();
    }

    @RequiresAuthentication

    public void test() {

    }
}

Это не работает должным образом (метод выполняется, аннотация Apache Shiro игнорируется):

  public class LoginView extends CustomComponent {

    public LoginWindow() {
        setCompositionRoot(mainLayout);
        //this will execture but it should not
        test();
    }

    @RequiresAuthentication

    public void test() {

    }
}

person Daniel Novak    schedule 15.04.2012    source источник


Ответы (1)


Использование подобных аннотаций во время выполнения обычно связано с АОП.

С помощью Spring AOP вы не можете перехватывать вызовы self : это потому, что Spring AOP генерирует прокси-классы, и перехват происходит на этих прокси -> он не может перехватывать вызовы self.

Я подозреваю, что Guice AOP работает таким же образом.

NB: Одно из различий между TestClass/Impl и LoginView заключается в том, что TestClass реализует интерфейс; может случиться так, что Guice по-разному обрабатывает прокси интерфейса и прокси "нормального класса" - я бы попробовал изменить TestClass, чтобы расширить абстрактный класс, и посмотреть, что там происходит.

person Charles Anthony    schedule 16.04.2012
comment
Спасибо за ваш ответ. Но TestClassImpl работает, даже если его внедрить напрямую, без интерфейса. Таким образом, это не вызовет исключение (но должно) injector.getInstance(LoginView.class);, и это работает, как и ожидалось (выдает исключение безопасности) injector.getInstance(TestClassImpl.class);. Оба они вызывают метод внутри конструктора, который помечен @RequiresAuthentification. - person Daniel Novak; 16.04.2012
comment
Хорошо, здесь есть более фундаментальная проблема. Guice не будет внедрять какие-либо классы внутрь CustomComponents. Я не знаю почему. Это определенно должно работать, но я делаю что-то не так. - person Daniel Novak; 18.04.2012
comment
Обновлять. У меня есть обходной путь для этой проблемы. В Components/Windows работает только внедрение конструктора (не знаю почему). Итак, я добавляю классы обслуживания, которые мне нужны, и внутри них есть аннотации Широ, которые работают. Мне нужно будет только программно проверить роли/разрешения Широ внутри классов компонента/окна Vaadin. - person Daniel Novak; 19.04.2012