如何使用自定义注释获取关联的参数

时间:2018-08-29 16:16:20

标签: java annotations spring-aop

@RestController
public class TestController {

    @GetMapping("/hello/{userId}")
    @Audit(type = AuditType.CREATE)
    public String hello(@AuditField @PathVariable long userId) {
        return "hello";
    }

}

我要扫描 @Audit 注释以及 @AuditField 。 @Audit扫描工作正常,但我也想获取 @AuditField 参数值。在我的情况下为 userId

我已经定义了@AfterReturning建议的方面。

import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class AuditAspect {

  @AfterReturning(pointcut = "@annotation(audit)", returning = "result")
  public void audit(JoinPoint jp, Object result, Audit audit) throws Exception {

   List<Object> auditFields = getAuditData(jp.getArgs());
   System.out.println(auditFields);
  }

  private List<Object> getAuditData(Object[] args) {
    return Arrays.stream(args)
        .filter(arg -> arg instanceof AuditField)
        .collect(Collectors.toList());
  }
}

但是在访问hello / 1时,auditFields显示为空。

1 个答案:

答案 0 :(得分:0)

您的假设是,通过对方法参数进行注释而使其以某种方式成为int factorial(int n){ if (n > 0) return n * factorial(n-1); return 1; } ,注释类是错误的,并且是不合逻辑的。相反,您需要做的是扫描方法签名中的参数注释,然后在方法签名的相应位置处返回方法参数,类似于这些答案中的示例代码,每个示例都显示出问题的细微变化: