我正在尝试拦截使用JAX-RS @POST注释的接口的方法。我的Pointcut适用于所有非接口方法,如果@ POST-Annotation直接在被调用的方法上。
拦截的界面方法:
@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 :(得分:0)
call()
切入点的作用,顾名思义,拦截对某个方法/构造函数的调用。为了使其工作,呼叫者(即呼叫所在的代码段)必须在你的控制之下,即它必须是编织的。如果是,例如你编织了org.myapp..webapi..*
类,并且从那里发出了调用,它应该可以工作。它不起作用使我假设POST调用来自编织代码之外的某个地方,例如JRE或第三方图书馆。
因此,如果org.myapp..webapi..*
在您的控制之下,即您可以将方面代码编入其中,则应使用execution()
切入点。与call()
相比,它被编织到被调用者中,即编入定义方法的代码中,而不是编入调用它的许多地方。这样您就可以拦截所有方法执行,无论它们来自您的应用程序或第三方或JRE代码。它甚至可以用于反射触发的方法执行。
call()
和execution()
具有根本不同的语义,这些语义有助于学习和理解。根据经验,您应尽可能尝试使用execution()
,即每当被调用者受到欢迎时。如果您无法编织进入被叫方并且必须使用来电者,call()
只是您的后退。如果由于某种原因你需要根据连接点上下文做出任何决定,call()
也是有意义的。在around()
建议中,根据某些条件决定调用或不调用原始方法。