【问题标题】:Spring Boot 2 after aop annotationaop注释后的Spring Boot 2
【发布时间】:2023-03-15 22:15:01
【问题描述】:

我正在尝试创建一个@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 接口中删除“值”属性并更改为 @annotation(FinalEvent),它就可以工作。但我需要传递参数。

如果我修改为 @Pointcut("@annotation(com.aspect.finalEvent)") 那么它会在 ::0 正式未绑定切入点处引发错误。

我该如何解决这个问题?

【问题讨论】:

    标签: java spring-boot aop spring-aop


    【解决方案1】:

    下面的代码可以工作

    @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-good-pointcuts

    您还可以通过@kriegaex 的answer 了解为什么@annotation 具有全局范围。

    【讨论】:

    • 感谢您的建议并修改了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2023-01-27
    • 2018-07-24
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多