关于Java:如何在ActionInvocation.invoke()中获取异常

How to get exception inside ActionInvocation.invoke()

首先,最终目的是我试图将DAO连接注入到SMD上下文(Ajax)中,以便确保事务已提交(或回滚),但我的问题是我没有能够知道invoke()方法是否引发异常,

我有以下拦截器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class SomeInterceptor implements Interceptor {
    private static final long serialVersionUID = 1L;
    @Override
    public String intercept(ActionInvocation invocation) {
        String result ="";
        GenericDAO dao = new GenericDAO();
        try {
            dao.begin();
            invocation.getInvocationContext().put("contextDao", dao);
            result = invocation.invoke();
            //attempt to solve
            Object exception = invocation.getInvocationContext().getValueStack().findValue("exception");
            if (exception != null && exception instanceof Exception){
                dao.rollback();
            } else {
                dao.commit();
            }
        } catch (Exception ex) {
            dao.rollback();
            System.out.println("ROLLBACK!");
            ex.printStackTrace();
        } finally {
            dao.close();
        }
        return result;
    }
}

"尝试解决"行就是基于此问题的。在调用内部,我只是抛出NullPointerException,现在的结果是该异常在Interceptor的catch之前被捕获,但是不是我设置的catch,

1
2
3
4
5
6
7
8
@SMDMethod
public HashMap<String,String> someMethod() {
    IGenericDAO dao = (IGenericDAO) ActionContext.getContext().get("contextDao");
    //dao's deletes, updates that i want to rollback
    HashMap<String,String> x = null;
    x.put("x","x"); //<---- NPE!
    return null;
}

我希望ActionInvocation.invoke()引发异常,所以我知道我需要回滚数据库会话。任何成功达到此目的的方法都是值得欢迎的,

编辑1:
我发现这个问题几乎和我一样,但是我不明白如何使用回滚(以我的观点总是在进行回滚)

问候


我没有找到想要实现自己目标的任何方法,相反,我通过执行以下操作解决了方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class SomeInterceptor implements Interceptor {
    private static final long serialVersionUID = 1L;
    @Override
    public String intercept(ActionInvocation invocation) {
        String result ="";
        GenericDAO dao = new GenericDAO();
        try {
            dao.begin();
            invocation.getInvocationContext().put("contextDao", dao);
            result = invocation.invoke();
            dao.rollback();
        } catch (Exception ex) {
            dao.rollback();
            System.out.println("ROLLBACK!");
            ex.printStackTrace();
        } finally {
            dao.close();
        }
        return result;
    }
}

是的...我在拦截器上删除了" commit"指令,现在我被迫在使用提及的DAO的任何调用结束时执行" commit",

1
2
3
4
5
6
7
8
9
@SMDMethod
public HashMap<String,String> someMethod() {
    IGenericDAO dao = (IGenericDAO) ActionContext.getContext().get("contextDao");
    //dao's deletes, updates that i want to rollback
    HashMap<String,String> x = null;
    x.put("x","x"); //<---- NPE!
    dao.commit();   //<---- COMMIT!
    return null;
}

我不喜欢这种解决方案,但这就是我所能做的。在发布问题后的第一天,我就这样想出来了,直到现在我一直在等待答案,

希望对别人有帮助,