2012-04-15 18 views
1

Apache ShiroがVaadinのGuice(ShiroWebModuleのおかげで)と働くことができました。 Shiro注釈(@RequiresAuthentication,@RequiresPermission)は、主なVaadin Applicationクラスとカスタムクラス内でのみ機能します。 CustomComponent/Windowクラス内では動作しません。Apache Shiro + Guice - 注釈を受け取ることができません

私はGuiceのと士郎に新しいですので、多分私は何かが欠けています

...私はinjector.getInstanceを通じて、プロバイダとApplicationクラスにウィンドウクラスを注入しようと、それはまだ動作しませんか?

他のカスタムクラスではなぜ機能しますか?予想されるように、これは予想通りこれは(Apacheの史郎アノテーションは無視され、メソッドが実行される)は動作しません

public class TestClassImpl implements TestClass { 

    @Override 

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

    @RequiresAuthentication 

    public void test() { 

    } 
} 

(例外がスローされます)作品:

public class LoginView extends CustomComponent { 

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

    @RequiresAuthentication 

    public void test() { 

    } 
} 

答えて

2

実行時にこのような注釈を使用して、通常はAOPを伴う。

Spring AOPでは、自分自身への呼び出しを傍受することはできません。これは、Spring AOPがプロキシクラスを生成し、それらのプロキシで傍受が発生し、自己への呼び出しを傍受できないためです。

私はGuice AOPが同じように動作するのではないかと疑います。

NB:TestClass/ImplとLoginViewの違いの1つは、TestClassがInterfaceを実装していることです。 GuiceがInterfaceプロキシと「通常のクラス」のプロキシを別々に扱うケースがあります。抽象クラスを拡張するためにTestClassを変更して、そこで何が起こるかを見てみましょう。

+0

ご返信ありがとうございます。しかし、TestClassImplはインターフェースなしで直接注入されたとしても動作します。したがって、例外はスローされません(ただし、 'injector.getInstance(LoginView.class);)、これは期待どおりに動作します(セキュリティ例外をスローします)\t' injector.getInstance(TestClassImpl.class); '。どちらも@RequiresAuthentificationで注釈が付けられたコンストラクタ内のメソッドを呼び出します。 –

+0

ここでは、より根本的な問題があります。 GuiceはCustomComponents内にクラスを挿入しません。どうしてか分かりません。それは間違いなく動作するはずですが、私は何か間違っています。 –

+0

更新。私はこの問題の回避策を持っています。コンポーザーインジェクションのみがComponents/Windowsで動作します(理由はわかりません)。だから、私は必要なサービスクラスを注入し、これらはShiroの注釈を内部に持っています。私は、Vaadinコンポーネント/ウィンドウクラス内のShiroロール/パーミッションをプログラムでチェックするだけで済みます。 –

関連する問題