当前位置: 代码迷 >> Java Web开发 >> SSH整合后错误只能在action中捕获,其它层都捕获不到
  详细解决方案

SSH整合后错误只能在action中捕获,其它层都捕获不到

热度:4618   发布时间:2013-02-25 21:18:24.0
SSH整合后异常只能在action中捕获,其它层都捕获不到
我使用ssh框架写的一个小系统,但是发现异常只能在action中捕获到,在其它层都捕获不到。

dao的实现类代码:
Java code
    public void add(T t)  throws DataAccessException{            this.hibernateTemplate.save(t);    }

业务层(在impl包下)代码:
Java code
    public boolean doAddProject(Project project) {        try {            projectDAO.addProject(project);        }catch (DataAccessException e) {                            return false;            e.printStackTrace();        }        catch (Exception e) {            e.printStackTrace();            return false;        }        return true;    }


action代码:
Java code
        try {            projectManagerBiz.doAddProject(project);        } catch (Exception e) {            e.printStackTrace();        }

配置 的切面:
Java code
<tx:advice id="txAdvice" transaction-manager="transactionManager">        <tx:attributes>            <tx:method name="doAdd*" propagation="REQUIRED" />            <tx:method name="doDel*" propagation="REQUIRED" />            <tx:method name="doUpdate*" propagation="REQUIRED" />            <tx:method name="*" read-only="true" />        </tx:attributes>    </tx:advice>

Java code
    <aop:config>        <aop:pointcut id="allManagerMethod"            expression="execution(* impl.*.* (..))" />        <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" />    </aop:config>


我最初的目的是想在业务层捕获到异常,但是发现无论是业务层还是dao层都捕获不到,只能在action中捕获到异常,最奇怪的是我在业务层没有抛出异常,却在action中捕获到了,在业务层却捕获不到。
我尝试过在的业务层和dao层,无论是接口还是实现类都是throws DataAccessException获得throws Exception,还是只能在action中catch到异常。
大家可能看出这里的问题出在哪呢?

------解决方案--------------------------------------------------------
public boolean doAddProject(Project project) {
try {
projectDAO.addProject(project);
}catch (DataAccessException e) {
return false;
e.printStackTrace(); }
catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}




------解决方案--------------------------------------------------------
返回永远是true,说明没有异常啊......
你还是把异常信息贴出来吧...
------解决方案--------------------------------------------------------
既然用spring来代理你事务 ,那就不要在需要事务的方法里面给可能异常的代码块 加上 try catch 块了。 而是让需要事务的方法 throws 异常 这样 spring才能够捕获到你的异常 ,然后执行回滚,如果你直接在方法里面try catch了 ,那么spring还捕获的到什么异常呢?

另外 ,spring只会对xxxException(记得不是很清出了)以及其子类进行捕获,然后回滚。
如果要让spring对你自定义的Exception捕获到之后也回滚。那么就要加上
//比如 ,要让spring对所有捕获到的Exception都回滚
<tx:method name="doAdd*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
  相关解决方案