在使用自定义椭圆批注和自定义类进行判断时,是否可以访问批注并检索使用的批注属性?

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


Minimal example

让我们假设我们有Foo班. 它有两个带注释的字段.
每次,注释都有不同的myValue-ab.

class Foo {
  @CustomAnnotation(myValue = "a")
  public String first;

  @CustomAnnotation(myValue = "b")
  public String second;
}

这是批注.
需要注意的是,应该使用MyCheck.class来执行判断,这也为myValue设置了一些缺省值.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Constraint(checkWith = MyCheck.class)
public @interface CustomAnnotation {
    String myValue() default "";
}

现在,我们要使用OVAL来验证此字段.
最重要的是,我们希望从注释myValue中提取值ab,并在验证逻辑中使用它.

public class MyCheck extends AbstractAnnotationCheck<CustomAnnotation> {


    @Override
    public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context,
                               Validator validator) throws OValException {
  // how to get the value of `myValue`, which is `a` or `b` or empty string as default
  }
}

我try 过,但失败了:

  1. validatedObject等于Foo.class.您可以很容易地获得它的字段和注释.但是,无法区分这两个注释.
  2. 在这种情况下,valueToValidateString的值-firstsecond所包含的值.
  3. context没有用,你可以从中得到编译时类型,它是String
  4. validator没有用吗?

推荐答案

在研究了超类之后,我发现您可以重写方法

  • 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 {}
}

Java相关问答推荐

PDFBox SmallMap不尊重Map.入口哈希码合同

Java应用程序RAC感知

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

我的scala文件失败了Scala.g4 ANTLR语法

ApachePOI:不带换行的新行

Java inline Double条件和值解装箱崩溃

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

如何修复PDF重建过程中的文本定位

匹配一组字符或另一组字符

有效的公式或值列表必须少于或等于255个字符

SpringBoot:在条件{Variable}.isBlank/{Variable}.isEmpty不起作用的情况下进行路径变量验证

无法使用Freemarker从XML中读取重复的标记值

如何在列表(链表)中插入一个新 node (作为prelast)

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

Java System.getProperty在哪里检索user.home?