【问题标题】:Lists with Java Annotations带有 Java 注解的列表
【发布时间】:2012-10-31 16:04:45
【问题描述】:

我想用 Java Annotation 验证我的论点。我不知道如何使用为列表编写自己的注释。

这里是一个简单的例子:

class test{

    @myAnnotation
    List<myObject> myElements =new List<>(); // validated List
}

class myObject{

        String name;
 }

我的注解界面:

  @Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) 
  @Retention(RetentionPolicy.RUNTIME)
  @Constraint(validatedBy=myAnnotation_Validator.class)
  @Documented


public @interface myAnnotation {
          String message() default "List is not valid";
          Class <?>[] groups() default {};
          Class <?extends Payload>[] payload() default{};

          String[] namen();
    }

public class myAnnotation_Validator implements ConstraintValidator<myAnnotation, Collection> {

    @Override
    public void initialize(Kredite_List_Check a) {
        // What to do here???
    }


    @Override
    public boolean isValid(Collection t, ConstraintValidatorContext cvc) {
        // What to do here???
        // How could i get the names from my List "myElements" ?
        return false;
    }

}

在此示例中,如果我的列表中的每个元素都有另一个名称,我的列表是有效的。我不知道如何在 Validator 类中获取 listobject 以及 myObject-elements 的名称。

更新:

我尝试用另一种方式来描述我的问题:

如果我的列表(“myElements”)中类型为“myObject”的两个元素具有相同的名称,则我的列表无效!

我如何通过注释实现这一点?

【问题讨论】:

标签: java annotations bean-validation


【解决方案1】:
public class myAnnotation_Validator implements ConstraintValidator<myAnnotation, Collection> {
     private String[] names;

     @Override
     public void initialize(myAnnotation a) {
        //get values which are defined in the annotation
        names = myAnnotation.namen();
     } 

     @Override
     public boolean isValid(Collection objectToValidate, ConstraintValidatorContext cvc) {

        if(objectToValidate == null) return true; // use the @NotNull annotation for null checks 

        for(Object o : objectToValidate) {
           //check if value is valid
        }

        return false; 
    } 
}

在初始化方法中,您可以获取在注释中定义的值。 isValid 方法用于验证对象(objectToValidate -> 您的列表对象)。

有关如何编写自定义验证器的更多信息,请参阅http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-validator

Hibernate-Validator 实现也是一个很好的参考。 https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators

希望这个回答对你有帮助。

【讨论】:

    【解决方案2】:

    我可以部分回答你的问题, 您可以从集合中获取名称,该集合在您的 isValid 方法中作为参数发送。迭代您的集合(在您的情况下为列表)。

    @Override
    public boolean isValid(Collection t, ConstraintValidatorContext cvc) {
        // Iterate your Collection t to get the names.
        return false;
    }
    

    【讨论】:

    • “我的测试对象不可用”是什么意思。要走的路是迭代传递给你的集合。这是您放置自定义约束注释的集合,也就是 myElements。
    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多