论坛首页 Java企业应用论坛

@AfterThrowing通知中操作完成后,如何让程序终止

浏览 9313 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-10-13  
需求:
在异常抛出后,异常通知会进行处理,比如如果查询数据库后并不存在某一个用户,在service层中并不每次都判断是否为null,而是交给切面来做,这样调用该为null的用户的其他方法的时候,出现空指针异常,异常通知就能切入,当遇到数据库查询为空的时候,可以直接让response sendRedirct
问题:
在Spring 的切面中编写异常通知时,由于异常通知并不真正的解决异常(和try catch块不同),只是做一些其他的逻辑处理,即response sendRedirct之后,客户端(浏览器)确实跳转了,但是后台程序并不会终止,异常仍会继续向上层抛出。在Service中仍然报空指针
如何在异常通知执行完毕后,让程序终止?有木有有经验的介绍下..(我试过在异常通知中捕获该异常,即使是捕获了Service层仍然会报空指针,并且继续执行)
   发表时间:2013-10-13  
这个应该在切面抛出异常;然后再ExceptionHandler里捕获异常进行处理

https://github.com/zhangkaitao/es/blob/master/web/src/main/java/com/sishuok/es/extra/exception/web/DefaultExceptionHandler.java
0 请登录后投票
   发表时间:2013-10-15  
jinnianshilongnian 写道
这个应该在切面抛出异常;然后再ExceptionHandler里捕获异常进行处理

https://github.com/zhangkaitao/es/blob/master/web/src/main/java/com/sishuok/es/extra/exception/web/DefaultExceptionHandler.java

我明白你的意思了,只是使用该注解或者SimpleMappingExceptionResolver后,发现前台是跳转到指定的界面,但是后台还是会报空指针,这种效果跟自己利用SpringAOP做一个切面的效果是一样的,我是想不让后台把这些错误打印出来就好了(就像已经被catch了一样),看起来舒服些
0 请登录后投票
   发表时间:2013-10-15  
你试试在web.xml配置
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/base/portal/error.jsp</location>
    </error-page>

可以从request.getAttribute("javax.servlet.error.exception")中得到error
http://jinnianshilongnian.iteye.com/blog/1753460

你试试这样还打印嘛。
0 请登录后投票
   发表时间:2013-10-15  

[quote="jinnianshilongnian"]你试试在web.xml配置 java.lang.Exception /base/portal/error.jsp 可以从request.getAttribute("javax.servlet.error.exception")中得到error [url]http://jinnianshilongnian.iteye.com/blog/1753460[/url] 你试试这样还打印嘛。[/quote]

我有一个疑问和一个事实

疑问:这样做岂不是将处理异常的能力交给Servlet容器来做,这样Spring容器岂不是没有用到?

事实:刚才测了,取出了Spring里面的SimpleMappingExceptionResolver的配置,在web.xml加上该配置后,界面确实跳到了指定界面,遗憾的是后台还是会打印报错。

 你看是这样吗

 

  • 大小: 10.7 KB
0 请登录后投票
   发表时间:2013-10-16  
最后经过讨论,得出一个解决方案:
需要明确几点
1:SimpleMappingExceptionResolver只是一个当抛出异常的时候,能够进行捕捉(或者称为监听到该异常)
2:当你捕捉后你可以根据该SimpleMappingExceptionResolver中的属性配置可以在前台展示的不同的错误界面,但它并不会帮你解决异常,不能实现try catch的功能
3:要解决异常还是必须写try catch,只是我们的目的是在Controller中彻底消灭异常
解决方案:
不论是Dao层、Service层,我们的异常可以全部向上层抛,在Controller层,我们自定义一个切面,类型是Around,并不是AfterThrowing,在Around中可以访问ProceedJoinPoint,该类有个proceed()和proceed(参数)两个方法,将try catch加载该方法上即可。这样在Controller的方法中不用在关心异常问题,可以把精力转移到实现业务功能上。
只是觉得该Around类型的切面有点大材小用了....
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics