如何将验证组传递给自定义约束
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
}
我在 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();
”
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
}