AspectJ Pointcut调用JAX-RS带注释的接口方法

时间:2013-06-27 12:24:07

标签: java interface jax-rs aspectj pointcuts

我正在尝试拦截使用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中有什么可以改变的吗?我怎样才能使这个工作?

1 个答案:

答案 0 :(得分:0)

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

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

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