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

Java 如何在ActionInvocation.invoke()中获取异常,java,struts2,interceptor,hibernate3,smd,Java,Struts2,Interceptor,Hibernate3,Smd,首先,最终目的是,我试图将DAO连接注入SMD上下文(Ajax),因此我将确保提交(或回滚)事务,我的问题是我无法知道invoke()方法是否引发异常 我有以下拦截器: public class SomeInterceptor implements Interceptor { private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation

首先,最终目的是,我试图将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;
}
@SMDMethod
公共HashMap someMethod(){
IGenericDAO=(IGenericDAO)ActionContext.getContext().get(“contextDao”);
//dao的删除,我想回滚的更新
HashMap x=null;

x、 放(“x”,“x”);//我没有找到任何方法来实现我想要的目标,相反,我通过这样做解决了这个问题:

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;
}
@SMDMethod
公共HashMap someMethod(){
IGenericDAO=(IGenericDAO)ActionContext.getContext().get(“contextDao”);
//dao的删除,我想回滚的更新
HashMap x=null;

x、 put(“x”,“x”);//我想你应该在结果中找到
错误
,而不是
异常
。也许我错了。但至少试一次。我试过了,没用:/