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

yxly2008 2012-05-14 05:09:25
我使用ssh框架写的一个小系统,但是发现异常只能在action中捕获到,在其它层都捕获不到。

dao的实现类代码:

public void add(T t) throws DataAccessException{
this.hibernateTemplate.save(t);
}

业务层(在impl包下)代码:

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代码:

try {
projectManagerBiz.doAddProject(project);
} catch (Exception e) {
e.printStackTrace();
}

配置 的切面:

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


<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到异常。
大家可能看出这里的问题出在哪呢?
...全文
459 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿狸_A_桃子 2014-11-13
  • 打赏
  • 举报
回复
哥们,我现在使用 SpringMVC,Spring、Hibernate 也遇到了同样的问题 ,请问最后你是怎么处理了呢
orchidchen 2012-10-31
  • 打赏
  • 举报
回复
因为你在serive层配置好了事务<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>
所以,action里执行了,才会递交数据库,这时才会出错,如果你想在service层抱错,除非把事务设到dao层去,事务在哪里,就是事务完成了,并出错,则哪里出错,而且要返回后才出现错误。这个spring和hibernate就是这么设置的。源码除非改动,文档里很少提及。
_jerrytiger 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

ACTION捕获的异常不就是业务层的异常吗? projectManagerBiz.doAddProject(project);
[/Quote]

当然不是 , 业务层已经将异常try catch了 ,也就是它自己已经处理了 , 怎么还会有异常让action捕获。
  • 打赏
  • 举报
回复
ACTION捕获的异常不就是业务层的异常吗? projectManagerBiz.doAddProject(project);
_jerrytiger 2012-05-17
  • 打赏
  • 举报
回复
既然用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" />
yxly2008 2012-05-17
  • 打赏
  • 举报
回复
异常就是hibernate产生的hql语句异常,在action中能捕获到,我测试过了,仅仅是因为hql的语句的原因才报的异常,我的疑问是在service层怎么就捕获不到异常信息
yxly2008 2012-05-15
  • 打赏
  • 举报
回复
一楼你标注的return 的地方我debug过了,是进不去的,我是做测试用的,返回的永远是true
wolf863292 2012-05-15
  • 打赏
  • 举报
回复
return...
标注的已经很清楚了...
热烈的红颜 2012-05-15
  • 打赏
  • 举报
回复
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;
}



wolf863292 2012-05-15
  • 打赏
  • 举报
回复
返回永远是true,说明没有异常啊......
你还是把异常信息贴出来吧...
Epiphone 2012-05-15
  • 打赏
  • 举报
回复

public boolean doAddProject(Project project) {
try {
projectDAO.addProject(project);
} catch (Exception e) {
e.printStackTrace();
//return false;
}
return true;
}

这样试试

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧