它实际上非常简单,是可以编写的最简单的方面。;-)
您的示例代码的丑陋之处在于它使用了几个您没有显示源代码的类,因此我必须创建虚拟类/接口才能使您的代码编译。你也没有展示验证器是如何应用的,所以我不得不推测。无论如何,这是一组完全自洽的示例类:
助手类:
这只是为了使所有内容都可以编译的脚手架。
package de.scrum_master.app;
public interface Payload {}
package de.scrum_master.app;
public class ConstraintValidatorContext {}
package de.scrum_master.app;
public @interface Constraint {
Class<MyValidator>[] validatedBy();
}
package de.scrum_master.app;
import java.lang.annotation.Annotation;
public interface ConstraintValidator<T1 extends Annotation, T2> {
void initialize(T1 annotation);
boolean isValid(T2 value, ConstraintValidatorContext validatorContext);
}
package de.scrum_master.app;
public class MyValidator implements ConstraintValidator<MyAnnotation, String> {
@Override
public void initialize(MyAnnotation annotation) {}
@Override
public boolean isValid(String value, ConstraintValidatorContext validatorContext) {
if ("msg".equals(value))
return true;
return false;
}
}
package de.scrum_master.app;
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)
@Constraint(validatedBy = { MyValidator.class })
public @interface MyAnnotation {
String message() default "DEFAULT_FALSE";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
驱动应用:
如果你想测试一些东西,你不仅需要一个正面的测试用例,还需要一个负面的测试用例。因为您没有提供,所以用户 Sampisa 的答案不是您想要的。顺便说一句,我认为您应该能够自己从中推断出解决方案。你甚至没有尝试。你没有任何编程经验吗?
package de.scrum_master.app;
public class Application {
public static void main(String[] args) {
Application application = new Application();
System.out.println(application.validate1());
System.out.println(application.validate2());
}
@MyAnnotation(message = "execute me")
public boolean validate1() {
return true;
}
@MyAnnotation(message = "msg")
public boolean validate2() {
return true;
}
}
方面:
我在 Sampisa 之外添加另一个示例方面的唯一原因是他的解决方案在反射使用方面不是最理想的。它很丑而且很慢。我认为我的解决方案更优雅一些。你自己看:
package de.scrum_master.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class SkipValidationAspect {
@Around("execution(@de.scrum_master.app.MyAnnotation(message=\"msg\") boolean *(..))")
public boolean skipValidation(ProceedingJoinPoint thisJoinPoint) throws Throwable {
return false;
}
}
很简单,不是吗?
控制台日志:
true
false
等等 - 我想这就是你要找的。