java - Spring @Around 用于异常处理

标签 java spring aop

情况如下: 我的应用程序扩展了一个框架。所以我没有 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 才能应用这些方面。它不适用于非 spring 管理的 bean。参见 this section of the reference guide .

您正试图拦截 javax. 程序包上的执行,这是一种特殊情况,只能在 load-time weaving environment 中运行。而不是基于代理或基于编译时的解决方案。此外,使用加载时编织来编织它们也可能很棘手,因为这些类可能在加载时编织开始之前就已经加载了。

The aspect is fine, btw, it can catch other method invocations from my codebase.

实际上你的方面是有缺陷的,@Around 建议应该总是返回 Object 并且应该总是返回调用 proceed() 的结果方法(除非您重新抛出 Exception。您的方面中断正确返回结果,现在每个方法有效地返回 null

链接:

  1. 代理机制 | reference guide
  2. 在 Spring 框架中使用 AspectJ 进行加载时编织 | reference guide
  3. 周围建议 | reference guide

关于java - Spring @Around 用于异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21377582/

相关文章:

java - 接口(interface)内 transient

java - JDBCTemplate 挂起

java - Android启动Service的一个方面

javascript - 使用 spring 保护单页应用程序

java - 在 Spring 中使用 AspectJ 捕获映射器方法内的 setter

java - Spring AOP 不拦截 Spring 容器内的方法

java - 选择使用工作区内的资源运行服务器时在 RAD 8 中部署和运行 spring 应用程序时出错

java - 将值从文本框传递到另一个 JFrame 的标签

java - Gradle基于环境属性构建War文件

javascript - Angular2/Spring Boot 允许在 PUT 上跨源