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...
}

请注意,每次出现未捕获的异常时,它都会显示带有错误信息的对话框窗口。这只是对您的用户界面的建议,对于您的问题的特定情况,请使用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 回答