2013-07-21 63 views
5

我有一個頁面,輸入文本組件標記爲required="true",並在服務器端有一個自定義的Validator在客戶端中刪除輸入時,驗證程序會跳過 - 按照JSF規範進行驗證?

現在作爲客戶端,我提交沒有該組件呈現的HTML元素的頁面(這可以通過使用瀏覽器的內置DOM元素檢查器從DOM樹中移除元素來輕鬆實現)。表單已成功提交,沒有服務器端驗證此必需組件。

這是按照JSF規範嗎?有沒有一種方法可以指定頁面中的驗證器即使被髮布的頁面不包含它們也將被執行?

回答

4

這是根據規範。以下是UIInput#validate() javadoc的相關摘錄:

getSubmittedValue()檢索提交的值。如果這返回null,退出沒有進一步處理。 (這表示沒有提交此組件的值。)

空輸入將發送空字符串,而不是null。完全沒有輸入將發送null,而不是空字符串。

這是否有害取決於業務邏輯。一個設計不當的模型(業務邏輯和/或數據模型)不會像預期的那樣考慮null會導致其他地方出現空指針異常或SQL約束衝突(NOT NULL),這通常會導致HTTP 500錯誤響應。但如果模型實際上認爲null是一個預期的情況,那麼它可能是模型中的一個錯誤。這個視圖(JSF頁面)只是爲了展示模型,然後可以對它做很少的事情。

如果業務邏輯或數據模型可以真的不被改變,以考慮null作爲一個特殊的情況下(即從不假定/接受給定值作爲null),你碰巧使用JPA,那麼最好的辦法是增加該物業爲@NotNull。雖然JSF將繞過對其的驗證,但JPA仍然會對其進行驗證,導致仍然存在異常和HTTP 500錯誤。在這種情況下,我只想知道爲什麼數據庫列首先沒有NOT NULL約束。或者,做class level validation

注意到應該是MyFaces的記錄本上象下面這樣的警告:

2016年3月16日上午08點55分52秒org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput
警告:如果輸入呈現,輸入的表單已提交,並且最初不呈現禁用或只讀,則應始終提供輸入值。通過JavaScript禁用輸入元素後,您無法提交表單。考慮將只讀設置爲true,或者在提交表單之前將禁用的值重置爲false。
組件:{Component-Path:[Class:javax.faces.component.UIViewRoot,ViewId:/test.xhtml][Class:javax.faces.component.html.HtmlBody,Id:j_id_5] [Class:javax.faces .component.html.HtmlForm,Id:j_id_6] [Class:javax.faces.component.html.HtmlInputText,Id:j_id_7]位置:/test.xhtml,位於第22行和第33列}

+0

Thanks for provide the javadoc提取物,它解釋了非常清楚的行爲。正如您所提到的那樣,它造成的危害取決於業務邏輯:可能會在空指針異常之前部分更新應用程序作用域對象,從而導致整個應用程序崩潰。 您是否也可以回答問題的第二部分:即使輸入爲空,是否可以驗證驗證? – mittal

+0

不是沒有黑客JSF。如果你碰巧使用了OmniFaces,最好的辦法是通過''強制BV(JSR303 Bean驗證;'@ NotNull'和朋友)支持類級bean驗證。 – BalusC