JSF验证器订购

时间:2011-09-11 12:51:16

标签: jsf-2 bean-validation

我遇到了一些bean验证问题。

基本上我有一个互联网用户可以创建新个人资料的表格,他们必须在那里输入他们的用户名。

我想验证关于:

的用户名
  1. 长度
  2. 模式
  3. 如果用户名已存在
  4. 对于子弹3,我编写了自己的自定义验证器@UserExists。问题是如果前两个验证器中的任何一个失败,我不希望运行此验证器。

    我发现在我的UserExists验证器上使用@GroupSequence可以解决序列问题,但如果其他验证器之一报告输入无效,JSF仍会调用我的验证器。我可以以某种方式检查其他验证器之一是否已经失效?

    这是我想要检查的属性:

    @Size(min = 3, max = 20)
    @Pattern(regexp = "[A-Za-z]+[A-Za-z0-9]*")
    @UserExists(message = "User already exists")
    private String username;
    

    自定义验证器具有以下属性:

    @Target({ElementType.METHOD, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(validatedBy = UserExistsValidator.class)
    @GroupSequence({Size.class, Pattern.class})
    public @interface UserExists
    

1 个答案:

答案 0 :(得分:2)

@GroupSequence注释旨在在托管约束的bean上指定。由于必须指定成员验证组,而不是单个约束。

所以你的例子可能会像那样实现:

@GroupSequence({Form.class, ExpensiveChecks.class})
public class Form {

    public interface ExpensiveChecks {}

    @Size(min = 3, max = 20)
    @Pattern(regexp = "[A-Za-z]+[A-Za-z0-9]*")
    @UserExists(message = "User already exists", groups=ExpensiveChecks.class)
    private String username;

}

这样就重新定义了Form类型的默认组序列。首先验证@Size@Pattern约束。只有在成功后,才会验证@UserExists约束(属于ExpensiveChecks组的一部分)。

您可以在Hibernate Validator reference guide和Bean验证specification中了解有关组序列和默认组序列重新定义的更多信息。