Apache Shiro + Guice - не може да накара анотациите да работят

Така успях да накарам Apache Shiro да работи с Guice (благодарение на ShiroWebModule) на Vaadin. Анотациите на Shiro (@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)


Използването на анотации като това по време на изпълнение обикновено включва AOP.

С Spring AOP не можете да прихванете повиквания към себе си: това е така, защото Spring AOP генерира прокси класове и прихващането се случва на тези прокси сървъри -> не може да прихване повиквания към себе си.

Подозирам, че 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 (не знам защо). Така че инжектирам сервизните класове, от които се нуждая, и те имат анотации на Shiro вътре, които работят. Ще трябва само да проверя програмно ролите/разрешението на Shiro вътре в компонента/класовете на прозореца Vaadin. - person Daniel Novak; 19.04.2012