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

aop注释后的Spring Boot 2

莫选
2023-03-14

我正在尝试创建一个@after aop注释,以便在方法完成后执行代码。当我通过参数时,我面临问题。

方面代码-

@Aspect
@Component
public class FinalAspect {

    @Pointcut("@annotation(finalEvent)")
    public void runFinalMethod() {}

    @After("runFinalMethod()")
    public void finalMethod(JoinPoint joinPoint, FinalEvent finalEvent) throws Throwable { 
       ....
    }
}

最终-

@Target({ElementType.Method})
@Retention(RetentionPolicy.RUNTIME)
public @interface FinalEvent {
   String value() default "";
}

控制器-

@FinalEvent(value = "test")
public ResponseEntity<String> getDetails() { ... }

这会引发错误:

错误引用的类型不是注释类型:finalEvent

但是,如果我从FinalEvent接口中删除“value”属性并更改为@annotation(FinalEvent),它就可以工作。但我需要传递参数。

如果我修改为@Pointcut(“@annotation(com.aspect.finalEvent)”),那么它在切入点中的::0 formal unbound处抛出错误。

我该如何解决这个问题?

共有1个答案

慕铭
2023-03-14

以下代码可以工作

@Aspect
@Component
public class FinalAspect {

    @Pointcut("@annotation(finalEvent) && within(so.qn68380528.service..*)")
    public void runFinalMethod(FinalEvent finalEvent) {}

    @After("runFinalMethod(finalEvent)")
    public void finalMethod(FinalEvent finalEvent) throws Throwable { 
       System.out.println(finalEvent.value());
    }
}

请记住限制范围:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#writing-很好的切入点

您也可以通过@kriegaex的这个答案来理解为什么@注释具有全局范围。

 类似资料:
  • 问题内容: 我需要定义一个切入点,该切入点触发使用自定义注释注释的spring服务的所有方法的执行。我想定义切入点的注释将在另一个注释上。 然后该服务将被注释如下 我尝试使用以下切入点定义,但是仅当@Y在服务本身上时才有效,这意味着它看不到注释在@X上 问题答案: 我在应用程序中有这个确切的需求。我找到了这个答案,但不满意无法完成。 经过更多搜索之后,我发现了用于AspectJ / Spring切

  • 我需要定义一个切入点,该切入点触发对使用自定义注释注释的spring服务的所有方法的执行。我想要定义切入点的注释将位于其他注释上。 然后该服务将被注释为以下内容 我尝试了以下切入点定义,但它仅在@Y位于服务本身时有效,这意味着它看不到注释位于@X上

  • 我正在创建一个类来审核对Spring Boot应用程序控制器类的调用: 我的一个Controller类看起来像这样——在类AND方法级别有注释(此时我不能更改): 我可以很好地提取url、methodtype和参数。然而,我现在很难做的是拉控制器类的注释('/applications'),这样我就可以为我的审计表构建完整的URL。 我知道还有其他审计选项(比如Spring Boot Actuato

  • 假设我有这样一种方法: 是否有一个切入点表达式可以选择所有参数带有@CustomAnnotation注释的方法?如果是这样的话,有没有一种方法可以让我访问“value”参数?