1

首先,最终目的是我试图将 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: 我发现这个问题和我几乎一样,但我不明白如何使用回滚(在我看来总是回滚)

问候

4

1 回答 1

0

我没有找到任何方法来实现我想要的目标,而是通过这样做解决了这个场景:

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

是的...我在拦截器中删除了“提交”指令,现在我被迫在使用上述 DAO 的任何调用结束时执行“提交”,

@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;
}

我不喜欢这个解决方案,但这是我能做的。我在发布问题后 1 天就提出了这个问题,直到现在我才等到答案,

希望它可以帮助某人,

于 2014-06-16T22:09:13.043 回答