![](/img/trans.png)
[英]Looking for solution to intercept baseclass inherited method using Spring AOP
[英]Can I intercept null pointer exceptions in a method using Spring AOP?
我們有一堆pdf報告類,這些類在大量導入存檔數據后開始偶爾丟失數據位時引發空指針異常,例如thing.getOtherThing().getText();
將沒有OtherThing
,並且報告將失敗。
在我看來,我們有幾種選擇
或者...我們可以在這里用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.