2012-10-12 25 views
3

如果發生jsf驗證錯誤,是否可以執行某些操作(某些清理)?
字段使用xhtml中的標籤進行驗證,例如'required =「true」',f:validateRegex pattern =「\ d *」','f:validator validatorId =「someValidator」'。
我需要將託管bean的某些屬性字段設置爲null(當頁面出現任何故障時)。 但是,如果驗證失敗,那麼JSF將進入「渲染響應階段」並且不會調用管理Bean方法。 在這種情況下,偵聽器(使用f:actionListener標籤)也不會被調用。

現在我想用豆註解像@AssertTrue,@Size等驗證來取代XHTML驗證 然後在一些這種驗證方法,將有可能使清理:當發生jsf驗證錯誤時執行操作

@ManagedBean 
class SomeBean { 
... 
    @AssertTrue 
    public void isClenup() { 
     cleanup(); 
    } 
... 
} 

但這似乎不是一個好的解決方案。
另外我注意到用@AssertTrue註解的幾個方法以未定義的順序調用。因此,從xhtml驗證切換到bean註釋驗證變得不那麼容易。
是否可以定義一些使用@AssertTrue註解的調用方法的順序?

回答

3

如果在JSF驗證階段引發驗證異常,則所有提交的表單值都不會應用於模型。也不會調用任何在調用應用程序JSF階段執行的調用事件。不過你會注意到渲染仍然會發生,任何需要渲染或更新的組件都會這樣做。

從理論上講,如果任何用戶提交的內容無效,這應該足以回滾大多數用戶提交的內容,但是還有一些邊緣情況需要進行額外清理。不過,我強烈建議您首先仔細評估引導您需要的設計決策,因爲可能有更好的方式來滿足您的業務需求,而無需訴諸此。這就是說,我會執行預渲染事件,它會在每次回發時執行,並檢查某些驗證並執行必要的業務和表示邏輯。

<f:event listener="#{managedBean.initialize()}" type="preRenderView" /> 
4

事實上,我有一個相當普通的任務:有一個頁面具有搜索功能。
在沒有錯誤的搜索成功的情況下,應顯示結果,但如果發生驗證錯誤(在下一次搜索期間),則不應顯示以前的結果(但它是可見的,這是一個問題)。

我的計劃如下:以檢查初始化驗證失敗()使用facesContext.isValidationFailed(),如果這是真的,那麼隱藏(刪除)方法以前的搜索結果:

public void initialize() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    boolean validationFailed = context.isValidationFailed(); 
    if(validationFailed) { 
     clearPreviousSearchResult(); 
    } 
} 

但隨後我發現使用bean註釋進行驗證(如@AssertTrue)不會設置facesContext.validationFailed();! 也就是說這

@AssertTrue(message = "Some error message") 
public boolean isValidateSomeField() { 
    return validate(getSomeFieldValue()); 
} 

後,你會得到context.isValidationFailed()== false,如果失敗,會出現(雖然我預料真)
(XHTML驗證或驗證或f:驗證不設置FacesContext中。validationFailed()如預期)

因此,有必要設置情境手動失敗:

@AssertTrue(message = "Some error message") 
public boolean isValidateSomeField() { 
    if(!validate(getSomeFieldValue())) { 
     FacesContext.getCurrentInstance().validationFailed(); 
     return false; 
    } 
    return true; 
} 

但由於How to check in after phase of Validations phase if validation has failed?我意識到,這個問題就可以解決更容易!只需用幾行包:

<h:panelGroup rendered="#{!facesContext.validationFailed}"> 
    ...block not to show if validation errors occur... 
</h:panelGroup> 

而且無需使用註釋Bean驗證和一些initialize()方法!

相關問題