2010-06-23 96 views
8

我有一個帶有很多方法的服務接口,所有方法都帶一個Request對象並返回一個Response對象。所有的請求對象都有一個共同的祖先,所有的響應對象都有一個不同的共同祖先(它有一個成功標誌和一個消息字段)。Spring aop切入點表達式訪問方法返回類型

現在我想要檢查權限等方面,執行服務調用,並返回一個失敗代碼的Response對象,如果有任何失敗。問題是:我需要知道創建什麼類型的Response對象。是否有一個切入點表達式使我可以訪問返回類型?也許這樣的事情?

@Around(value = "execution(public *" 
    + " com.mycompany.MyService+.*(..))" 
    + " && args(request)" 
    + " && returning(returnType)" // something like this would be nice 

, argNames = "request,returnType") 
public Object handleServiceCall(final ProceedingJoinPoint pjp, 
    final Request request, 
    final Class<? extends Response> returnType){ ... } 
+0

所以,你想建議幾個具有相同方面的方法,有時需要產生並返回響應對象而不調用服務,並且該響應對象必須是服務方法的正確子類型? – 2010-06-23 09:52:46

+0

是的,這正是我想要的 – 2010-06-23 11:34:06

回答

6

JoinPoint的Javadoc提到了getSignature()方法,它的返回類型Signature有子接口MethodSignature你可以嘗試投射,其方法有getReturnType(),這可能是你正在尋找的。

+0

我知道這一點。這是我準備去的方式,如果沒有更好的解決方案存在,但我更喜歡切入點表達式。 – 2010-06-23 10:08:14

0

你可以做環繞通知方法內,辦理入住手續(handleServiceCall()你的情況)

Object actuals = pjp.proceed(); 
if(actuals instanceof MyResponse){ 
//TO:DO: Your code here 
} 
+0

我知道,但這不會幫助,因爲我不會總是執行pjp.proceed()。如果我的方面決定用戶沒有執行服務調用的權利,它將直接創建響應對象而無需繼續。 – 2010-06-23 09:27:19

+0

不要在切入點表達式中使用'*'作爲'ret-type-pattern'。而是使用您想攔截的方法的實際返回類型。 – chedine 2010-06-23 09:46:09

+0

不好:我想攔截很多不同的返回類型,我想知道我擁有哪一個。 – 2010-06-23 10:07:18