当前位置: 首页 > 知识库问答 >
问题:

JAX-RS注释接口方法上的AspectJ切入点调用

贺飞
2023-03-14

我试图拦截一个用JAX-RS@POST标注的接口方法。我的切入点适用于所有非接口方法,如果@POST-注释直接位于被调用的方法。

拦截的接口方法:

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

要匹配方法的PointCut:

@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()
{
...
}

接口在v1com.myapp.social.webapi.包中,即使我将方法更改为公共AeyJ也不会拦截调用。

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

共有1个答案

诸葛煜
2023-03-14

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

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

call()execution()具有根本不同的语义,值得学习和理解。根据经验,只要可能,即只要被调用方可以为您编辑,您就应该尝试使用execution()<如果您无法融入被调用方并且必须使用调用方,则code>call()只是您的退路<如果出于某种原因,您需要根据连接点上下文做出任何决定,例如在一个决定根据某些条件调用或不调用原始方法的通知中,code>call()也有意义。

 类似资料:
  • 问题内容: 如何编写适用于方法执行的AspectJ切入点,该方法执行会使用注释覆盖接口方法?例如: 仅当带有注释本身时,切入点才匹配。还有另一种方法吗? 问题答案: 正如Nicholas指出的那样,这在AspectJ中是不可能的。这是无法实现的更多证据(摘自http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations-

  • 我正在使用Spring的AspectJ和CGLIB代理。我有一个定义如下的方面,我希望它在具体的类上为公共方法提供建议,这些类是用批注“validatormethod”批注的:

  • 我试图在方法注释上创建一个Aeyj切入点,但我总是用不同的方法失败。我使用的是aspectj自动代理(我在Spring上下文中没有配置其他编织)。我的类如下所示: 所以我想知道为什么aspectj不会创建切入点。我设法使用执行(**(…)使其工作抛出一些exc)这对我来说很好,但我仍然想知道我做错了什么。 另外,由于是在接口中定义的,我指定了实现类的注释,有没有办法让它以这种方式工作?其他代理机制

  • 我想拦截所有java。sql。数据源。getConnection方法使用aspectj时,我使用了以下切入点: 它工作得很好。但我遇到了一些类,例如org。阿帕奇。公猫jdbc。水塘在该切入点不起作用的类层次结构中实现的数据源,其中数据源方法位于不实现数据源的层次结构中的类中,只有最顶层的类实现数据源: BaseDataSource不实现DataSource,但具有所有DataSource方法实现

  • 使用加载时间编织,纯AspectJ。 我们有2个注释和,以及一些带注释的方法。 现在我正在为具有多个注释的定义自己的围绕方面: 这行不通。然而,捕获方法myMethod2可以很好地用于单个注释: 我只想捕获签名中同时存在时间和计数注释的方法,并且我想使用注释值。有人知道如何做到这一点吗?

  • 服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?