如何将验证组传递给自定义约束

How to pass a validation group to a custom constraint

我在 Spring MVC 中创建了一些用于验证的约束,但我在为约束定义验证组时遇到问题

这是我创建的约束之一的示例

约束

public @interface DropDown {

    String value();
    String message() default"{DropDown}";

    Class<?>[] groups() default{};
    Class<? extends Payload>[] payload() default{};
}

这是我创建的验证器 class 以符合约束条件。

验证者

public class DropdownConstraintValidator implements ConstraintValidator<DropDown, String>{

    private String annotationSelect;

    @Override
    public void initialize(DropDown dropdown) {
        // TODO Auto-generated method stub
        this.annotationSelect = dropdown.value();

    }

    @Override
    public boolean isValid(String selectField, ConstraintValidatorContext cntx) {
        // TODO Auto-generated method stub

        if(selectField == null){

          return false;
        }

        if(selectField.equals(annotationSelect)){

            return false;
        }
        else

            return true;


    }



}

在我的一个模型中,这就是我使用约束的方式

public Modelname{
@DropDown("Please Select")
private String selection;
//getters --Setters
}

约束检查下拉框中的选定值是否已更改。如果该值仍然是 "Please Select",则会触发验证错误。这很好用,但对于我的表单,我想根据屏幕上的条件跳过一些框。

就像标准的 JSR 303 验证一样。我想像这样使用我的约束

public Modelname{
@DropDown("Please Select", groups={displayed.class})
private String selection;
}

我假设因为我定义了传递给验证器的值,所以组应该以相同的方式定义,但我花了一整天的时间在网上搜索,但我似乎找不到任何文档来清楚地解释如何去做。即使在这个网站上

这就是我在其中一个模型中使用约束的方式。

 public class Personalinfo {

        private int id;


        @DropDown("Please Select", groups ={displayedgroups.class})
        private String title;

        @NotBlank(message = "Please provide your name", groups ={displayedgroups.class})
        private String name;

//rest of the class attributes with getters and setters
}   

下一行是我遇到编译错误的地方:无效的 MemberValuePairs

@DropDown("Please Select", groups ={displayedgroups.class})

谢谢

http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html_single/

正确的语法与 NotBlank 示例中使用的语法相同:

@DropDown(message = "Please Select", groups = {displayedgroups.class})

@DropDown(value = "Please Select", groups = {displayedgroups.class})

取决于您要填充的属性(值或消息)"Please Select"。

如果

,您只能省略属性名称
  • 属性是value
  • 这是您要在注释中设置的唯一属性。

我找到了问题的解决方案。我不得不删除“Class<?>[] groups();

旁边的“default{};
  public @interface DropDown {

    String value();
    String message() default"{DropDown}";

    Class<?>[] groups();
    Class<? extends Payload>[] payload() default{};
}

现在在模型上,注释将期望您定义属性 groups。例如。

public Modelname{

  @DropDown("Please Select", groups=displayed.class)
  private String selection;
  //rest of the code here

}