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

时间:2015-08-02 21:09:55

标签: validation spring-mvc annotations

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

以下是我创建的一个约束

的示例

约束

public @interface DropDown {

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

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

这是我使用约束创建的验证器类。

验证器

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
}

约束检查下拉框中的选定值是否已更改。如果值仍然是&#34;请选择&#34;然后触发验证错误。这很好用,但对于我的表单,我想根据屏幕上的条件跳过一些框。

就像标准的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/

2 个答案:

答案 0 :(得分:0)

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

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

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

取决于您要填充的属性(值或消息)&#34;请选择&#34;。

如果

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

答案 1 :(得分:0)

我找到了解决问题的方法。我必须删除“Class<?>[] groups();”旁边的“默认{};

  public @interface DropDown {

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

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

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

public Modelname{

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

}
相关问题