java – Spring AOP – 从catch块调用建议
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring AOP – 从catch块调用建议,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3148字,纯文字阅读大概需要5分钟。
内容图文
![java – Spring AOP – 从catch块调用建议](/upload/InfoBanner/zyjiaocheng/785/0d3d7d1dc93b468296a5963b71cc120b.jpg)
目的:每次执行业务逻辑时发生异常,都会向管理员发送电子邮件.
直到现在我遇到了“抛出建议”,这很好并且在从目标方法引发异常时执行.
这可能对我有用,但我必须在设置请求属性和下一页方面做一些额外的处理.我认为通过使这些对象保持静态来与目标类共享对象并不是一个好主意.代码场景如下所示:
try{
//normal processing
} catch (AuthenticationException ae) {
ae.printStackTrace();
req.setAttribute("msg", ae.getMessage());
//execute advice at this point
return loginPage;
}
PLS.看看我想执行建议并相应地建议解决方案.
最好的祝福
解决方法:
我知道你想要避免使用完整的AspectJ而不是Spring AOP. (顺便说一句,我想知道为什么很多人都如此害怕它.)无论如何,在AspectJ中通过handler()切入点很容易拦截异常处理程序执行(= catch blocks).但有一个限制:它只适用于before()建议,而不适用于()或around().这是由于编译器的限制.查看异常处理程序的JVM字节代码,您将看到无法检测处理程序块的结尾.无论如何,因为这个概念与原始问题有关,所以我想在这里展示它是如何完成的.我创建了一个小驱动程序应用程序和一个非常简单的方面:
import java.util.Random;
import javax.naming.AuthenticationException;
public class Application {
public static void main(String[] args) {
Application app = new Application();
System.out.println(app.foo(1, "two", 3d));
System.out.println(app.bar("one", 2d, 3));
System.out.println(app.zot(1d, 2, "three"));
}
public String foo(int i, String string, double d) {
try {
if (new Random().nextBoolean())
throw new AuthenticationException("wrong password");
}
catch (AuthenticationException e) {
return "return value from catch block";
}
return "normal return value";
}
public String bar(String string, double d, int i) {
try {
if (new Random().nextBoolean())
throw new IllegalArgumentException("I don't like your arguments");
}
catch (IllegalArgumentException e) {
return "return value from catch block";
}
return "normal return value";
}
public String zot(double d, int i, String string) {
try {
int n = 2/0;
}
catch (Throwable t) {
return "return value from catch block";
}
return "normal return value";
}
}
如您所见,方法foo和bar基于ca中的随机值抛出异常.占所有案例的50%,而zot总是抛出除零异常.因此输出将随着运行而不同.
那么,如果所有异常都被静默吞下并且没有记录,我们如何才能知道发生了什么?像这样:
import java.util.logging.Logger;
public aspect ExceptionLoggingAspect {
final Logger log = Logger.getLogger(ExceptionLoggingAspect.class.getName());
before(Throwable t) : handler(Throwable+) && args(t) {
log.warning(thisJoinPointStaticPart + " -> " + t);
}
}
这非常简单而优雅,适用于整个应用程序.这是一些测试输出:
Apr 6, 2013 12:15:43 PM ExceptionLoggingAspect ajc$before$ExceptionLoggingAspect$1$3d90b181
WARNING: handler(catch(AuthenticationException)) -> javax.naming.AuthenticationException: wrong password
return value from catch block
Apr 6, 2013 12:15:43 PM ExceptionLoggingAspect ajc$before$ExceptionLoggingAspect$1$3d90b181
WARNING: handler(catch(IllegalArgumentException)) -> java.lang.IllegalArgumentException: I don't like your arguments
return value from catch block
Apr 6, 2013 12:15:43 PM ExceptionLoggingAspect ajc$before$ExceptionLoggingAspect$1$3d90b181
WARNING: handler(catch(Throwable)) -> java.lang.ArithmeticException: / by zero
return value from catch block
在建议中你可以做更多,例如访问它并读取/更新一些属性,所以堡垒.
内容总结
以上是互联网集市为您收集整理的java – Spring AOP – 从catch块调用建议全部内容,希望文章能够帮你解决java – Spring AOP – 从catch块调用建议所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。