【问题标题】:how to access custom annotation values in spring aspect如何在spring方面访问自定义注释值
【发布时间】:2015-09-20 06:00:08
【问题描述】:

我正在尝试从jointCut 访问自定义注释值。但我找不到办法。

我的示例代码:

@ComponentValidation(input1="input1", typeOfRule="validation", logger=Log.EXCEPTION)
public boolean validator(Map<String,String> mapStr) {
    //blah blah
}

试图访问@Aspect 类。

但是,我没有看到任何访问值的范围。

我尝试访问的方式如下代码

CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature(); 
String[] names = codeSignature.getParameterNames();
MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
Annotation[][] annotations = methodSignature.getMethod().getParameterAnnotations();
Object[] values = joinPoint.getArgs();

我没有看到任何值返回 input = input1。如何做到这一点。

【问题讨论】:

  • 能否提供包括整个自定义验证在内的所有代码
  • 嗨,我也处于使用 aspectj 进行自定义注释的学习阶段。你能给我一个如何使用自定义注释的演示吗?我是spring aspectj的新手。任何帮助将不胜感激。提前致谢。

标签: spring aspectj spring-aop spring-aspects


【解决方案1】:

要获取值,请使用以下代码:

ComponentValidation validation = methodSignature.getMethod().getAnnotation(ComponentValidation.class);

你可以调用validation.getInput1(),假设你在ComponentValidation自定义注解中有这个方法。

【讨论】:

    【解决方案2】:

    虽然 Jama Asatillayev 的答案从普通 Java 的角度来看是正确的,但它涉及到反射。

    但这个问题专门针对 Spring AOP 或 AspectJ,并且有一种更简单、更规范的方法可以使用 AspectJ 语法将匹配的注释绑定到方面建议参数 - 顺便说一句,无需任何反射。

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    import my.package.ComponentValidation;
    
    @Aspect
    public class MyAspect {
        @Before("@annotation(validation)")
        public void myAdvice(JoinPoint thisJoinPoint, ComponentValidation validation) {
            System.out.println(thisJoinPoint + " -> " + validation);
        }
    }
    

    【讨论】:

      【解决方案3】:

      例如,如果您在 Annotation 接口中定义了一个方法,如下所示:

      @Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
      @Retention(RetentionPolicy.RUNTIME)
      public @interface AspectParameter {
          String passArgument() default "";
      }
      

      然后你可以访问类和方法的值,如下所示:

      @Slf4j
      @Aspect
      @Component
      public class ParameterAspect {
      
          @Before("@annotation(AspectParameter)")
          public void validateInternalService(JoinPoint joinPoint, AspectParameter aspectParameter) throws Throwable {    
              String customParameter = aspectParameter.passArgument();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        • 2018-05-07
        • 2018-03-31
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多