繁体   English   中英

Spring @Around用于异常处理

[英]Spring @Around for exception handling

情况如下:我的应用程序扩展了一个框架。 因此,我没有main()或我声明的任何其他入口点(我重写了该框架提供的方法,并安排了其他所有内容)。 这个框架可以保证安全。 安全性是基于Apache Mina构建的。

当与应用程序建立不安全的连接时,mina会引发异常,这是堆栈跟踪:

Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
        at sun.security.ssl.EngineInputRecord.bytesInCompletePacket(EngineInputRecord.java:171) ~[na:1.7.0_21]
        at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:845) ~[na:1.7.0_21]
        at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758) ~[na:1.7.0_21]
        at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) ~[na:1.7.0_21]
        at org.apache.mina.filter.support.SSLHandler.unwrap0(SSLHandler.java:657) ~[mina-filter-ssl-1.1.7.jar:na]
        at org.apache.mina.filter.support.SSLHandler.unwrapHandshake(SSLHandler.java:613) ~[mina-filter-ssl-1.1.7.jar:na]
        at org.apache.mina.filter.support.SSLHandler.handshake(SSLHandler.java:493) ~[mina-filter-ssl-1.1.7.jar:na]
        at org.apache.mina.filter.support.SSLHandler.messageReceived(SSLHandler.java:306) ~[mina-filter-ssl-1.1.7.jar:na]
        at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:392) ~[mina-filter-ssl-1.1.7.jar:na]
        ... 12 common frames omitted

我想使用AOP技巧来捕获此错误,因此我可以很好地通知用户并发送警报。 我想到了这方面:

@Aspect
public class SSLExceptionCatcherAdvice {

    private static final Logger LOG = LoggerFactory.getLogger(SSLExceptionCatcherAdvice.class);

    @Around("execution(* *.unwrap(..))")
    public void catchException(ProceedingJoinPoint pjp) {
        try {
            pjp.proceed();
        } catch (Throwable exception) {
            LOG.info("########################################");
        }
    }

}

但是,它根本不会被调用。 顺便说一句,这很好,它可以捕获我代码库中的其他方法调用。

有什么建议吗? 提前谢谢。

默认情况下,Spring使用基于代理的AOP解决方案,因此,只有Spring托管的bean才能应用这些方面。 它不适用于非春季托管的Bean。 请参阅参考指南的本部分

您正在尝试拦截Javax上的执行javax. 软件包,这是一种特殊情况,只能在加载时编织环境中使用,而不能与基于代理或基于编译时的解决方案一起使用。 将它们与加载时编织结合起来也可能很棘手,因为这些类可能在加载时编织之前就已经加载了。

顺便说一句,这很好,它可以捕获我代码库中的其他方法调用。

实际上,您的方面有缺陷, @Around通知应始终返回Object并应始终返回调用proceed()方法的结果(除非您抛出Exception 。您的方面正常中断,返回结果,现在有效地每个方法都返回null

链接:

  1. 代理机制| 参考指南
  2. 在Spring Framework中使用AspectJ进行加载时编织 参考指南
  3. 周围建议| 参考指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM