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

拦截自定义注释的方面

冷善
2023-03-14

我正在编写一个库/sdk,它可以拦截任何使用自定义注释@Monitor进行注释的方法。代码的工作方式有点像这样

@Monitor
public void methodA(String test)

截取这个的方面有一个切入点表达式

@After("execution(@com.packageA.Monitor * *(..))")
public void intercept(final JoinPoint joinPoint){
...}

当我在与方法A相同的包中描述方面时,此代码工作正常。但是,如果我创建一个单独的库并定义方面,因为它无法拦截方法A。有帮助吗?

回应@Bond的评论

@Component
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Monitor {

}

Spring版本:Spring上下文-4.1.7。发布aspectj-1.6.5问题的关键是注释不会在同一个项目中使用。在编译之后,它将一起用于不同的项目。

第二个项目,即应该拦截此方面的项目,是使用aspectj maven插件编译的

共有1个答案

万俟光临
2023-03-14

您需要将切入点更新为注释(com.x.y.z.Monitor)。(相应地更正程序包名称)

因此,你的相位应该如下所示

@After("@annotation(com.x.y.z.Monitor)") 
public void intercept(final JoinPoint joinPoint){
    ...
}

请看一些示例,以参考各种可用的切入点表达式。如果advise接受参数,也请阅读此内容

 类似资料:
  • 问题内容: Java专家 我很新,还没有搜索很多,所以请忍受… 我想实现一个将调用方法的方法;从最基础的东西开始,它可以只打印方法名称和参数,这样我就可以避免使用该语句。 像这样的示例调用: 可以转换为: 我可以得到一些提示吗? 问题答案: 根据您对我的评论的回答,您将无法仅凭注释来执行此操作。当然,您可以创建批注并创建一些反射代码,然后将其检测出来并执行一些代码,但这不会对代码造成太大的改变,因

  • 我试图在Karaf中定义和使用自定义运行时注释。它不适合我。 我可以将包配置为使用Pax CDI OpenWebBeans CDI容器。集装箱很好用。我可以看到公开的服务(standard annotation@OsgiServiceProvider)。 但对于已定义的@AroundInvoke方法的自定义拦截器标记,它不处理使用自定义注释方法进行注释的拦截器标记。 我使用apache-karaf

  • 我试图让aspectj拦截带注释的方法: 我删除了!为了简洁起见,在(InterceptMeAspect)内,但它并没有拦截太多。如果我删除注释约束(在(@InterceptMe*)内),它可以工作,但会拦截所有内容,这会造成一个大问题。 输出字节码似乎有完整的注释,所以我希望注释标准匹配。我正在或试图进行编译时编织。这很重要,因为我有另一个方面确实使用上面相同的方法工作。我怀疑该方面正在搞乱这个

  • null 我尝试将@priority(interceptor.priority.platform_beform)和@prematching也放入我的过滤器中,但即使是在OIDC启动后也会调用。 另外,是否有任何方法支持扩展quarkus oidc逻辑以包括自定义代码? 我无法获得oidc和keycloak-auth拦截器的优先级(知道这些可以帮助我决定过滤器的优先级)。请帮忙。

  • 我发现了几个与此相关的(不是重复的)问题,但它们不能让我满意。 我无法理解在哪里以及为什么要使用? 我在一本书中读到了一个自定义注释的示例,但没有详细解释。 myMeth()内的输出与预期一致。 关于这个例子,我有几个问题。 1-如何在此程序中使用和?或