从自定义椭圆形注释访问注释属性

Tal*_*los 5 java oval

当使用自定义椭圆注释和自定义类进行检查时,是否可以访问注释并检索使用的注释属性?

\n

椭圆形参考:https ://sebthom.github.io/oval/USERGUIDE.html#custom-constraint-annotations

\n
\n

最小的例子

\n

假设我们有 class Foo。\n它有两个带注释的字段。
\n每次,注释都有不同的myValue\xe2\x80\x93ab.

\n
class Foo {\n  @CustomAnnotation(myValue = "a")\n  public String first;\n\n  @CustomAnnotation(myValue = "b")\n  public String second;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是注释。
\n请注意,应使用 执行检查MyCheck.class,并为 设置一些默认值myValue

\n
@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})\n@Constraint(checkWith = MyCheck.class)\npublic @interface CustomAnnotation {\n    String myValue() default "";\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们想使用 oval 来验证该字段。\n最重要的是,我们希望从注释中
提取值a或并在验证逻辑中使用它。bmyValue

\n
class Foo {\n  @CustomAnnotation(myValue = "a")\n  public String first;\n\n  @CustomAnnotation(myValue = "b")\n  public String second;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过但失败的:

\n
    \n
  1. validatedObjectFoo.class。您可以轻松获取其字段和注释。但是,无法区分这两个注释。
  2. \n
  3. valueToValidate在这种情况下,String值 \xe2\x80\x93 包含什么firstsecond
  4. \n
  5. context没有用,你可以从中获取编译时类型,即String
  6. \n
  7. validator没有用 ?
  8. \n
\n

Tal*_*los 0

经过对超类的一些挖掘后,我发现你可以重写方法

  • configure

此方法获取当前正在现场检查的注释作为唯一参数。
然后您就可以阅读myValue.

public class MyCheck extends AbstractAnnotationCheck<CustomAnnotation> {

    private String myValue;

    @Override
    public void configure(CustomAnnotation customAnnotation) {
        super.configure(customAnnotation);
        this.myValue = customAnnotation.myValue();
    }

    @Override
    public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context,
                               Validator validator) throws OValException {
        if (myValue.equals("a")) {}
        else if (myValue.equals("b")){}
        else {}
}
Run Code Online (Sandbox Code Playgroud)