簡體   English   中英

我可以在使用Spring AOP的方法中攔截空指針異常嗎?

[英]Can I intercept null pointer exceptions in a method using Spring AOP?

我們有一堆pdf報告類,這些類在大量導入存檔數據后開始偶爾丟失數據位時引發空指針異常,例如thing.getOtherThing().getText(); 將沒有OtherThing ,並且報告將失敗。

在我看來,我們有幾種選擇

  1. 修正數據-不清楚每種情況下數據應該是什么,在某些情況下是人為判斷的問題
  2. 隨處放置try / catching並重新拋出有用的異常以冒泡給用戶-大量的工作和丑陋的代碼,但對用戶有用
  3. 將空檢查放在各處-不用了,謝謝
  4. 處理DAO代碼以在查詢中合並/ nvl並在缺少的字段(或庫)中生成N / A的報告-好的,但沒有那么有用

或者...我們可以在這里用AOP做些什么嗎? 是否可以攔截某些類/方法中拋出的空指針? 當這些信息被攔截時,可以提供什么級別的信息? 請記住,方法中的多個位置可能會拋出空指針:(

謝謝。

Uff ..這可能很痛苦,但是我真誠地建議您仔細檢查代碼,並在合理的地方進行null的檢查,為自己構建一個實用程序類,以便您可以執行類似的操作

MyUtilityHelper.checkNotNull (toCheck, elegantMessage)

並使該方法拋出一些您可以了解更多信息的東西。

AOP實際上不適用於恕我直言,您不希望使用順序邏輯來完成AOP的工作,只是因為代碼更適合順序處理... AOP適用於要添加水平層的情況功能,例如安全性,日志記錄...

AOP可能會幫助您達成解決方案,但是您需要在引發異常之前采取措施,因為異常會導致您失去太多執行上下文。 首先,當您編寫thing.getOtherThing.getText()getOtherThing是一個具有奇數名稱或方法調用的字段,而您不小心省略了括號嗎? 如果是后者,你可以使用Spring AOP攔截方法( 提供 thing實際上是一個bean)。 否則,您將需要完整的AspectJ,因為Spring AOP不會進行字段訪問攔截(因為它是如何實現的)。

這個想法是,您使用@Around定義切入點並獲得如下建議:

static final OtherThing THE_DEFAULT_VALUE = ...;

@Around("execution(* getOtherThing())")
public Object supplyDefault(ProceedingJoinPoint pjp) throws Throwable {
    Object result = pjp.proceed();
    if (result == null)
        result = THE_DEFAULT_VALUE;
    return result;
}

或者,使用AspectJ(未經測試;我實際上沒有將AspectJ用於任何東西):

aspect ADefaultOtherThing {
    static final OtherThing THE_DEFAULT_VALUE = ...;

    OtherThing around(): get(OtherThing getOtherThing) {
        OtherThing result = proceed();
        if (result == null)
            result = THE_DEFAULT_VALUE;
        return result;
    }
}

不過,我會懷疑這是否是AOP的特別好用法。 當然將這樣的業務邏輯直接放在代碼中會更好嗎? 保證字段永遠不會為null似乎是很好的不變性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM