【问题标题】:How to pass a validation group to a custom constraint如何将验证组传递给自定义约束
【发布时间】:2015-08-02 21:09:54
【问题描述】:

我在 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
}

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

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

以下行是我得到编译错误的地方:Invalid MemberValuePairs

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

谢谢

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

【问题讨论】:

  • 准确定义“不起作用”。包括您收到的任何错误消息,包括预期行为与实际行为。
  • 我得到一个编译错误。 "赋值的左边必须是变量"
  • 发布您的真实代码、您收到的完整且准确的错误消息,并告诉我们此消息所指代码的哪一行。
  • 除了模型类之外,我在问题中发布的代码是我的确切代码。我会用真实的模型更新问题。
  • publib Modelname{ 不能是您的确切代码。并且缺少最重要的部分:您收到的完整且准确的错误消息,以及该消息引用的代码行。

标签: validation spring-mvc annotations


【解决方案1】:

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

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

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

取决于您想用“请选择”填充哪个属性(值或消息)。

你只能省略属性名如果

  • 属性为value,并且
  • 这是您要在注释中设置的唯一属性。

【讨论】:

  • 是的,这是正确的语法,但这不是我的问题。在这种情况下,“请选择”是我用来检查此人是否在 Dropbox 上选择了某些内容的值。有时在春季进行验证时,您可以使用组根据某些条件进行验证。现在这适用于@NotBlank 等默认注释。但我似乎无法找到一种方法来定义我的自定义注释,以便它们接受参数“groups = {class}”。我不得不使用另一种方法,因为我的截止日期很紧,但最好知道如何去做。
  • 那么,当您键入@DropDown(value = "Please Select", groups = {displayedgroups.class}) 时,什么是准确且完整的编译器错误消息?
【解决方案2】:

我找到了解决问题的方法。我必须删除“Class&lt;?&gt;[] 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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    相关资源
    最近更新 更多