2011-09-11 49 views
2

我遇到了一些bean验证问题。JSF验证器订购

基本上我有一个表单,在这里互联网用户可以创建一个新的配置文件,他们必须输入他们的用户名。

我想关于验证用户名:

  1. 长度
  2. 模式
  3. 如果用户名已经存在

对于弹头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 

回答

2

@GroupSequence注释意在对托管的制约豆指定。由于成员验证组必须被指定,而不是单个约束。

所以你的例子可能实现这样的:

@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验证程序reference guide和Bean验证specification中了解更多关于组序列和重新定义默认组序列的信息。

+0

谢谢。我已经在参考指南,但显然不够彻底。 – foens