0

我试图拦截一个用 JAX-RS @POST 注释的接口的方法。我的切入点适用于所有非接口方法,如果 @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 也不会拦截调用。

我的切入点有什么要改变的吗?我怎样才能使它工作?

4

1 回答 1

0

call()顾名思义,切入点的作用是拦截对某个方法/构造函数的调用。为了使其工作,调用者(即调用所在的代码段)必须在您的控制之下,即它必须是经过编织的。因此,如果您已经编织了org.myapp..webapi..*课程并且也从那里发出了呼叫,那么它应该可以工作。它不起作用让我假设 POST 调用来自编织代码之外的某个地方,例如 JRE 或第 3 方库。

因此,如果org.myapp..webapi..*在您的控制之下,即您可以将方面代码编入其中,您应该使用execution()切入点。与之相反,call()它被编织到被调用者中,即被编织到定义方法的代码中,而不是被编织到调用它的许多地方。通过这种方式,您可以拦截所有方法执行,无论它们来自您的应用程序、第三方还是 JRE 代码。它甚至适用于由反射触发的方法执行。

call()并且execution()具有根本不同的语义,可以学习和理解。根据经验,您应该尽可能尝试使用execution(),即只要被调用者可以为您编织。call()如果您无法编织到被调用者并且必须使用调用者,则只是您的后备。如果由于某种原因您需要根据连接点上下文做出任何决定,例如在决定根据某些条件调用或不调用原始方法call()的建议中,这也是有意义的。around()

于 2013-07-09T08:05:51.327 回答