快捷搜索:

Acegi(十一): 借鉴Acegi的Exception的异常处理

本日改项目中的一个问题时, 不由自住地想到了Acegi非常处置惩罚. 现在比拟项目中的非常处置惩罚后, 很是感叹Acegi对非常的处置惩罚呀.

先大年夜致回忆下Acegi里的非常处置惩罚. 这里说Acegi的非常处置惩罚是指环抱ExceptionTranslationFilter展开的, 当然其余地方也有,暂时不做斟酌.

Acegi设置设置设备摆设摆设中在filterInvocationInterceptor前加了一个 exceptionTranslationFilter, 这样在全部措施调用栈里, exceptionTranslationFilter的doFilter是比filterInvocationInterceptor要低一层的, 而filterInvocationInterceptor的doFilter是很有可能抛出多种非常的, 这些非常即包孕Acegi自身的认证时非常和权限不敷非常,也包孕Serlet规范中可能抛出ServletException或 IOException. 不过filterInvocationInterceptor自身并没有处置惩罚任何非常,  不管有什么非常都采取无邪烂漫的要领,而且它自己还抛出了AuthenticationException和AccessDeniedException 两个非常.

非常由谁处置惩罚呢? 交给exceptionTranslationFilter来处置惩罚, 顾名思义, 这个Filter的本职事情便是来处置惩罚非常这些麻烦事的. 看源码, 我们知道, 这个filter除了非常处置惩罚外什么事都不做. 由handleException这个措施来专门跟来自filterInvocationInterceptor的非常打交道.

这样做有什么好处? 好处大年夜大年夜的, 解耦合, "冲锋陷阵"的"冲锋陷阵",做"后勤"的做"后勤", 大年夜家各司其职,井然有序, 这样两方都能发挥出最大年夜感化.终极的整体作战效果也会出奇地好.

再看项目中的一个小例子, 看如下代码:

Java代码

protected String sendAlertMessage(String to,String subject,String msg,String from) {

SimpleMailMessage mailMessage = createMessage(to,subject, msg,from);

try{

mailEngine.sendEmail(mailMessage);

}

catch(MailException ex) {

log.error(ex.getMessage());

return ex.getMessage();

}

return "1";

}

这段代码是用来发邮件的, 我们看下这里的非常处置惩罚. mailEngine的sendEmail会抛出非常的, 看了下文档它的抛出的非常为MailException, 而MailException有四个子类: MailAuthenticationException,MailParseException,MailPreparationException, MailSendException.而这里都给catch住了, 只把非常的message以String类型返回, 这样sendAlertMessage措施的调用者要想知道是邮件发送掉败的缘故原由就得烦些周折了. 原先MailException及其子类有很富厚的非常信息, 但因为sendAlertMessage措施的越俎代庖,枝节横生了.

现在假设这样一种环境, 法度榜样要发邮件, 可收件人的地址不存在, 系统要求把报错信息反馈给终端用户, 即显示信息"由AAA发送给BBB的邮件,因为BBB的email不存在而发送掉败", 这里为了更友好地显示, AAA用的是Ta的真名,而没有用Ta的邮件地址. 为了显示这样的报错信息, 调用sendAlertMessage就麻烦大年夜了,由于这里是没有AAA的真名的.

于是我们想,能不能像Acegi里处置惩罚非常那样用一个零丁的措施来做呢?  这样的设计显然是行的通的.

-----------后记-------------

1, 初学Java时, 知道OOP时非常处置惩罚的上风. 可项目中或自己写代码时,很少能全局地斟酌非常处置惩罚, 大年夜多环境下,发明IDE里显示有非常没处置惩罚了,想也没多想地给catch住了, 现在看来,非常处置惩罚时学问不小.

2, 这篇也是研究Acegi以来,除Security方面外,感到对自己面向工具赞助最大年夜也最显着的一次, 也让自己小小窃喜了下.

3, 着实是昨天发明项目中sendAlertMessage措施的不妙的, 当时也想写下来, 可总是理不出思路来. 本日做完头给安排的事情后,趁着情绪飞腾,再转头看这个问题时, 一下就想到Acegi时的非常处置惩罚. 于是有了这篇还算说得以前的记录. 头脑要清醒,否则要放一放了. 碰到问题,不要急也不要气馁, 法子老是有的, 静下心一遍两各处去看,会有线索的. 呵呵, 有点想小门生作文.

4,  不要只想着成功,更要想着掉败后的信息的反馈.似乎大年夜多半环境下, 掉败斟酌的很少.

您可能还会对下面的文章感兴趣: