2013-06-27 96 views
0

我試圖攔截JAX-RS @POST註釋的接口的方法。我的Pointcut適用於所有非接口方法,如果@ POST-Annotation直接位於調用的方法。AspectJ對JAX-RS註釋的切入點調用接口方法

接口方法攔截:

@POST 
Response postToConnector(@Context CallContext callContext, String contentStream) throws Exception; 

切入點,以匹配方法:

@Pointcut("call(@(javax.ws.rs.DELETE || javax.ws.rs.GET || javax.ws.rs.HEAD || javax.ws.rs.OPTIONS || " 
    + "javax.ws.rs.POST || javax.ws.rs.PUT) public * org.myapp..webapi..*(..))") 
public void anyPublicWebApiPointcut() 
{ 
... 
} 

該接口是一個包com.myapp.social.webapi.v1內,即使我將方法更改爲public AspectJ不會攔截該調用。

我的Pointcut內有什麼改變嗎?我怎樣才能使這個工作?

+0

我知道這個是舊的,但仍然列爲未答覆。如果看起來合適,請您接受並提出我的答案嗎?謝謝。 – kriegaex

回答

0

切入點的一個call()正如名字所暗示的那樣攔截對特定方法/構造函數的調用。爲了達到這個目的,呼叫者(即呼叫所在的那段代碼)必須在你的控制之下,即它必須是編織的。所以如果例如你編織了org.myapp..webapi..*類,並且從那裏發出呼叫,它應該工作。不起作用使我認爲POST調用來自編織代碼之外的某處,例如JRE或第三方圖書館。

因此,如果org.myapp..webapi..*在您的控制之下,即您可以編碼方面代碼,您應該使用execution()切入點。與call()相比,它被編織到被調用者中,即編入定義該方法的代碼中,而不是被調用到許多地方。這樣,您可以攔截所有方法執行,無論它們來自您的應用程序或第三方還是JRE代碼。它甚至可以用於由反射觸發的方法執行。

call()execution()具有根本不同的語義,這些語義學習和理解。作爲一個經驗法則,您應該儘可能地使用execution(),即每當被調用者爲您配戴時。 call()只是你的後退,如果你不能編織到被調用者,並且必須使用調用者。如果由於某種原因需要根據連接點上下文作出任何決定,例如call()也是有意義的,例如,在一個around()建議,決定打電話或不打電話的原始方法根據一些條件。

相關問題