【问题标题】:How to get the associated Parameter with Custom Annotation如何使用自定义注释获取关联的参数
【发布时间】:2018-09-01 17:51:27
【问题描述】:
@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 建议定义了 Aspect。

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 显示为空。

【问题讨论】:

    标签: java annotations spring-aop


    【解决方案1】:

    您假设通过注释方法参数它以某种方式变成instanceof 注释类是错误的并且非常不合逻辑。您需要做的是扫描方法签名以获取参数注释,然后在方法签名的相应位置返回方法参数,类似于我在这些答案中的示例代码,每个都显示您的问题略有不同的变化:

    【讨论】:

    • 但是如果有多个注释用于一个字段怎么办。然后它会破裂。
    • 我需要更好的解决方案。
    • 不存在更好的解决方案,因为方法参数注释不能绑定到切入点参数。我无法按照你的一厢情愿改变 AspectJ,对不起。要么使用反射,要么忘记它。您可以将所谓的“hack”包装到实用方法中,从而从使用它的各个方面隐藏复杂性。
    • 如果一个字段有多个注释,如果操作正确,它不会中断。我用我之前在这里写的几个相关答案的链接更新了我的答案。选择最接近您需要的内容并在必要时进行修改。真的没那么难。
    • 我会检查的。
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2018-07-31
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2017-03-31
    相关资源
    最近更新 更多