2011-09-27 61 views
2

我有一個電子郵件字段 ,我想,以驗證它是有效的電子郵件,並驗證它不存在於數據庫中使用FacesValidator(JSF驗證)和Bean驗證,所以我用了有效從休眠狀態在bean電子郵件模式@Email:問題關於一個領域

@NotBlank(message = "{email.required}") 
@Email(message = "{invalid.email}") 
@Size(max = 25, message = "{long.value}") 

,並在JSF頁面:

<f:validator binding="#{emailExistValidator}" /> 

我的問題:

  1. 首先發生什麼,面部驗證器或bean驗證?
  2. 你怎麼看待bean驗證和 FacesValidator之間的這種混合,如果是這樣的話,那麼你的建議是什麼?

回答

6

1 - 首先會發生什麼,臉上驗證或Bean驗證?

JSF轉換和驗證會首先在它被宣佈在組件上的順序運行,以required第一。如果其中任何一個失敗了,那麼JSF驗證和所有bean驗證的剩餘部分將被完全跳過,否則所有的bean驗證都會被執行。


2 - 你想想Bean驗證和FacesValidator之間的這種混合什麼,這是不好的做法,如果是的話你有什麼建議?

很難回答。它完全取決於驗證者的功能要求和目的,以及驗證與模型或視圖的緊密聯繫。

如果驗證需要每次運行模型屬性被設置(所以它與模型緊密相關),那麼bean驗證將是首選。但是如果驗證只需要運行一次,例如在註冊期間(所以它與特定視圖密切相關),那麼JSF驗證將是首選。

例如,如果您正在檢查電子郵件語法模式,那麼Bean驗證會更有意義,如:

@Pattern(regexp = "([^[email protected]]+)(\\.[^[email protected]]+)*@([^[email protected]]+\\.)+([^[email protected]]+)", message = "Email is not in valid format") 
private String email; 

如果你正在檢查對DB電子郵件所有腦幹,那麼JSF驗證會更有意義,因爲您不希望它在每個屬性集上被不必要地執行。數據庫調用本身並不便宜。

同樣,這是主觀的。看看最適合業務需求的是什麼。例如,也許您需要在每個屬性集上對其進行驗證。

+0

我需要在註冊和更新配置文件中驗證電子郵件,我想驗證電子郵件是否有效並且不存在於數據庫中,所以我認爲我必須同時使用JSF Validator和Bean驗證,你認爲 ? –

+0

注意:爲什麼你沒有在上面的示例中使用來自休眠的@Email,並且首選正則表達式? –

+1

我更喜歡獨立實現,除非不是真的或不容易。通過這種方式,只要使用其他JSR303實現而不是Hibernate部署到不同的容器,webapp仍然可以工作。您當然可以自由地將實施特定的限制放在您的webapp上(無論如何您都在使用和定位Tomcat),但是這應該在serveradmin的主webapp安裝/部署手冊中正確記錄。 – BalusC