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 |
我希望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 |
我不喜欢这种解决方案,但这就是我所能做的。在发布问题后的第一天,我就这样想出来了,直到现在我一直在等待答案,
希望对别人有帮助,