簡體   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