【问题标题】:AspectJ Pointcut call on JAX-RS annotated Interface method对 JAX-RS 注释接口方法的 AspectJ 切入点调用
【发布时间】:2013-06-27 12:24:07
【问题描述】:

我正在尝试拦截使用 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 也不会拦截调用。

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

【问题讨论】:

  • 我知道这是旧的,但仍列为未答复。如果它看起来合适,请您接受并支持我的回答吗?谢谢。

标签: java interface jax-rs aspectj pointcuts


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2013-02-12
    • 2023-03-03
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多