2011-09-11 78 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