2010-06-01 21 views
3

我需要你的幫助來更好地理解這一點。這是我的情況。我爲表單中的每個輸入控件都有一個自定義驗證器。所以當有任何驗證錯誤時,我會在validate方法中添加一個相應的FacesMessage。我的理解是,當有任何驗證錯誤 - 或者在Custom Validator的validate方法中添加了FacesMessage時,它將跳過INVOKE APPLICATION階段並直接調用RENDER RESPONSE PHASE - 顯示已添加的FacesMessage過程驗證階段 - 這是正確的嗎?在驗證錯誤期間添加面孔消息時,JSF是否會跳過調用應用程序階段?

我面臨的問題是 - 我在過程驗證階段添加了一個FacesMessage - 由於驗證錯誤 - 我添加了用戶在INVOKE應用階段採取的操作的確認消息 - 現在兩者都顯示在RENDER RESPONSE階段的頁面中? - 如果我的理解在上述問題中是正確的 - 在確認Curces FacesContext中沒有FacesMessages之後,是否有條件地添加確認FacesMessage是最佳做法?

這是如何增加消息:

FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR,Constants.invalidMessageDetail,null); 
     FacesContext.getCurrentInstance().addMessage(null, facesMessage); 
throw new ValidatorException(facesMessage); 

這是它是如何顯示:

<h:messages errorClass="ErrorMsg" warnClass="WarningMsg" infoClass="InfoMsg" layout="table" /> 

感謝你的幫助。

回答

7

我的理解是,當有任何驗證錯誤 - 或當有自定義驗證的驗證方法添加任何FacesMessages,它會跳過調用應用程序階段,並會直接調用Render Response階段 - 顯示在過程驗證階段添加的FacesMessage - 這是正確的嗎?

部分屬實。當ValidatorException已被拋出時,它只會跳過更新模型值並調用應用程序階段,而不是簡單地將FacesMessage添加到FacesContext時。

如果我的理解是正確的上述問題 - 這是確認不存在在當期的FacesContext中沒有FacesMessages後有條件地添加一個確認的FacesMessage最好的做法?

你需要拋出ValidatorException如下:

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    if (value does not meet conditions) { 
     throw new ValidatorException(new FacesMessage("value does not meet conditions")); 
    } 
} 

然後,它會跳過更新模型值,並根據需要調用應用階段。請注意,您不需要手動將面孔消息添加到上下文。當JSF抓到ValidatorException時,它將自己完成所有工作。

+0

感謝BalusC。這真的很有幫助。但現在,這些消息在頁面中顯示兩次。我在驗證方法中的sysouts顯示消息只添加一次。任何想法可能是什麼問題? – gekrish 2010-06-01 11:54:33

+0

也許是因爲你指示了觀點兩次展示它?即你有兩個'h:messages'元素。根據迄今爲止提供的信息很難說清楚。 – BalusC 2010-06-01 12:03:11

+0

我已添加如何添加以及如何顯示的代碼。你能檢查嗎? – gekrish 2010-06-01 12:10:06

相關問題