代码之家  ›  专栏  ›  技术社区  ›  Stéphane GRILLON

如何按方面获取自定义注释的参数?

  •  0
  • Stéphane GRILLON  · 技术社区  · 3 年前

    在我的方面方法中,我需要获取name的值(自定义注释的param) name = "unit test"

    用户调用的方法:

    @Service
    @RequiredArgsConstructor
    @Slf4j
    public class Task {
    
        @CronLogger(name = "unit test")
        public void testCronLogger(String param) {
            log.info("testCronLogger ...");
        }
    
    }
    

    自定义注释:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface CronLogger {
       public String name() default "";
    }
    

    方面方法:

    @Aspect
    @Component
    @EnableAspectJAutoProxy
    public class CronLoggerAspect {
        
        private static final Logger log = LoggerFactory.getLogger(CronLoggerAspect.class);
        
        @Around("@annotation(CronLogger)")
        public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
            Object[] tab = joinPoint.getArgs();
            for (Object object : tab) {
                log.debug("CronLogger: {}", object);
            }
           return joinPoint.proceed();
        }
    }
    

    安慰

    CronLogger: test
    testCronLogger ...
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   kriegaex    3 年前

    这个怎么样(未经测试,我只是修改了你的代码)?

    @Around("@annotation(cronLogger)")
    public Object trace(ProceedingJoinPoint joinPoint, CronLogger cronLogger) throws Throwable {
      log.debug("CronLogger: {}", cronLogger.name());
      return joinPoint.proceed();
    }
    

    请注意大小写字符。一个是注释类名,另一个是方法参数名。

        2
  •  1
  •   Stéphane GRILLON    3 年前

    需要getMethod并获取此方法的Annotation。

    @Around("@annotation(CronLogger)")
    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
        String name = MethodSignature.class.cast(joinPoint.getSignature()).getMethod().getAnnotation(CronLogger.class)
                .name();
        log.debug("CronLogger: {}", name);
        return joinPoint.proceed();
    }