3

私の前の質問のこのコメントをフォローアップします。@Aroundアドバイスから例外をスローし、呼び出し先クラスおよび/またはメソッド内でキャッチしようとしています。しかし、私はこのエラーが発生しています:

Stacktraces

java.lang.Exception: User not authorized
    com.company.aspect.AuthorizeUserAspect.isAuthorized(AuthorizeUserAspect.java:77)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:616)
    ...

アスペクトコードは次のとおりです。

@Aspect
public class AuthorizeUserAspect {
    @AuthoWired
    private UserService service;

    @Pointcut("@annotation(module)")
    public void authorizeBeforeExecution(AuthorizeUser module) {}

    @Around(value = "authorizeBeforeExecution(module)", argNames="module")
    public Object isAuthorized(ProceddingJoinPoint jp, AuthorizeUser module) throws Throwable {
        // Check if the user has permission or not
        service.checkUser();

        if ( /* User has NOT permission */ ) {
            throw new MyCustomException("User not authorized"); // => this is line 77
        }

        return jp.proceed();
    }
}

Struts ベースの UI アクション コードは次のとおりです。

@Component
public class DashboardAction extends ActionSupport {
    @Override
    @AuthorizeUser
    public String execute() {
        ...
    }

    private void showAccessDenied() {
       ...
    }
}

問題は、その例外をキャッチして実行する方法または場所showAccessDenied()です。

4

2 に答える 2

2

キャッチされなかった例外を処理MyCustomExceptionするには、Struts 2 でグローバルな例外ハンドラーを定義する必要があります。次のガイドを確認してください: http://struts.apache.org/2.3.4.1/docs/exception-handling.html

于 2012-09-05T10:03:38.890 に答える
0

ユーザー インターフェイスについては、キャッチされていない例外をキャッチするための短いコードを作成することをお勧めします。

class EventQueueProxy extends EventQueue {
    @Override
    protected void dispatchEvent(AWTEvent newEvent) {
        try {
            super.dispatchEvent(newEvent);
        } catch (Throwable t) {
            String message = t.getMessage();
            if (message == null || message.length() == 0) {
                message = "Fatal: " + t.getClass();
            }
            JOptionPane.showMessageDialog(null, message, "Unhandled Exception Caught!", JOptionPane.ERROR_MESSAGE);
        }
    }
}

そして、ui クラスで:

public static void main(String args[]) {

    EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
    queue.push(new EventQueueProxy());

    //your code goes here...
}

キャッチされていない例外が表示されるたびに、ダイアログ ウィンドウにエラー情報が表示されることに注意してください。これはあなたのUIへの提案にすぎません。あなたの問題の特定のケースでは、ユーザーを承認するメソッドを起動するにはtryを使用し、ユーザーが承認されていない場合に実行する必要があるメソッドを起動するにはcatchを使用してください。このような場合、承認が失敗した場合、承認メソッドは例外をスローする必要があります。その後、エラーは出力されませんが、代わりに特定のメソッドが起動されます。

それが私があなたのコードに追加するものです:

@Component 
public class DashboardAction extends ActionSupport {
    @Override
    try {
        @AuthorizeUser
        public String execute() {
                 ...     
        }
    } catch (Exception e) {
        private void showAccessDenied() {
                ...
        }
    }
} 
于 2012-09-05T09:13:17.683 に答える