首先,最终目的是我试图将 DAO 连接注入 SMD 上下文(Ajax),因此我将确保事务正在提交(或回滚),我的问题是我无法做到知道 invoke() 方法是否抛出异常,
我有以下拦截器:
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,现在的结果是异常在拦截器捕获之前被捕获,但是不是我设置的捕获,
@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: 我发现这个问题和我几乎一样,但我不明白如何使用回滚(在我看来总是回滚)
问候