@aspect - 使用@around注释 - 自定义注释方法未执行

时间:2017-03-17 06:37:11

标签: java annotations aspectj

我使用AspectJ创建了一个自定义注释,并尝试创建注释,如果注释无效,将有助于跳过方法。

但我的方法体不会被执行

这是我的代码

这是约束

package com.test;
public @interface SwitchLiteConstraint {

  Class<SwitchLiteValidator>[] validatedBy();

}

下面是约束验证器

package com.test;
import java.lang.annotation.Annotation;

public interface SwitchLiteConstraintValidator<T1 extends Annotation, T2> {
  void initialize(T1 annotation);
  boolean isValid(T2 value, SwitchLiteConstraintValidatorContext validatorContext);
}

下面是我的方面类

package com.test;

import java.lang.reflect.Method;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;

@Aspect
public class SwitchLiteValidationAspect {

    @Around("execution(boolean *(..))")
    public boolean skipValidation(ProceedingJoinPoint thisJoinPoint) throws Throwable {

        Method method = MethodSignature.class.cast(thisJoinPoint.getSignature()).getMethod();

        SwitchLiteAnnotation puff = method.getAnnotation(SwitchLiteAnnotation.class);

        if (puff == null) {
            System.out.println(" puff null returning true ");
            return true;
        } else {

            String aspectName = puff.message().trim();
        if(aspectName.equalsIgnoreCase("msg")){
            System.out.println("  returning true ");
            return true;
        }else{
            System.out.println("  returning false ");
            return false;
            }
        }

    }
}

下面是验证器实现

package com.test;
public class SwitchLiteValidator implements SwitchLiteConstraintValidator<SwitchLiteAnnotation, String> {
  @Override
  public void initialize(SwitchLiteAnnotation annotation) {}

  @Override
  public boolean isValid(String value, SwitchLiteConstraintValidatorContext validatorContext) {
    if ("msg".equalsIgnoreCase(value)){
      //return true;
      return true;
    }
    //return false;
    return false;
  }
}

下面是我的自定义注释

package com.test;

import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.*;

@Target({ METHOD, FIELD, PARAMETER })
@Retention(RUNTIME)
@SwitchLiteConstraint(validatedBy = { SwitchLiteValidator.class })
public @interface SwitchLiteAnnotation {
  String message() default "DEFAULT_FALSE";
}

以下是示例,我使用注释的方式

package com.test;


public class Application {
  public static void main(String[] args) {
    Application application = new Application();


    boolean first=false;
    boolean second=false;

    first=application.validate1();
    second=application.validate2();

    System.out.println(first);
    System.out.println(second);
  }

  @SwitchLiteAnnotation(message = "abc")
  public boolean validate1() {
      System.out.println("validate1");
      return true;
  }

  @SwitchLiteAnnotation(message = "msg")
  public boolean validate2() {
      System.out.println("validate2");
      return true;
  }



}

问题是我的System.out.println(“validate1”);和System.out.println(“validate2”);正在执行

1 个答案:

答案 0 :(得分:0)

您的注释SwitchLiteConstraint需要运行时保留,否则它在运行时将不可见,因此对方面不可见。你可能只是忘记了。

更新:我复制了所有源代码并在我的计算机上进行了尝试。我不明白你的问题是什么。没有方面输出是:

validate1
validate2
true
true

根据方面,输出变为:

  returning false 
  returning true 
false
true

这不是你想要的吗?