2012-08-17 37 views
1

我有一個用例,我想驗證一堆viewParams,如果我發現驗證錯誤,跳過preRenderView事件,只顯示錯誤消息。這可能嗎?如何在驗證失敗時跳過PreRenderView事件?

例如

<f:metadata> 
      <f:viewParam id="param1" name="p1" value="#{someBean.param1}" /> 
      <f:viewParam id="param2" name="p2" value="#{someBean.param2}" /> 
      <f:event type="javax.faces.event.PostValidateEvent" listener="#{someBean.validateParams}" /> 
      <f:event type="javax.faces.event.PreRenderViewEvent" listener="#{someBean.viewAction}" /> 
     </f:metadata> 

的方法validateParams()是用來做多字段驗證並有可能去是這樣的:

public void validateParams(ComponentSystemEvent event) { 
     UIComponent source = event.getComponent(); 

     Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue(); 
     Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue(); 

     boolean valid1 = validOneField(value1); 
     boolean valid2 = validOneField(value2); 
     boolean valid12 = validBothFields(valid1, valid2); 

     if(!valid1);//add facesMessage 
     if(!valid2);//add facesMessage 
     if(!valid12);//add facesMessage 

     if (!valid1 || !valid2 || !valid12) 
      FacesContext.getCurrentInstance().renderResponse(); 
    } 

我的理解是,無論是被迫的渲染響應,的viewAction()將仍然被稱爲。我可以很容易地修改viewAction()來考慮驗證,但是由於其他原因我想完全跳過它(這種方法中的一些雜亂的代碼,我寧可不碰)等等。有沒有一種方法可以完全繞過viewAction()並顯示驗證錯誤消息?

編輯:使用FacesContext.getCurrentInstance()的BalusC建議ValidationFailed()

我已經修訂validateParams()到:

public void validateParams(ComponentSystemEvent event) { 
     UIComponent source = event.getComponent(); 

     Integer value1 = (Integer) ((UIInput) source.findComponent("param1")).getLocalValue(); 
     Integer value2 = (Integer) ((UIInput) source.findComponent("param2")).getLocalValue(); 

     boolean valid1 = validOneField(value1); 
     boolean valid2 = validOneField(value2); 
     boolean valid12 = validBothFields(valid1, valid2); 

     if(!valid1);//add facesMessage 
     if(!valid2);//add facesMessage 
     if(!valid12);//add facesMessage 

     if (!valid1 || !valid2 || !valid12) 
      FacesContext.getCurrentInstance().ValidationFailed(); 
      FacesContext.getCurrentInstance().renderResponse(); 
    } 

和改性的viewAction()如下:

public void viewAction(ComponentSystemEvent cse) { 
    if(!FacesContext.getCurrentInstance().isValidationFailed()) { 
     // viewAction() code 
    } 
} 

這似乎現在對我有用。希望JSF 2.2中的視圖操作不要求我檢查驗證是否失敗,因爲我相信它們根本不會被調用(FacesContext.renderResponce()將跳過調用應用程序步驟,這是調用視圖操作的地方) 。

回答

1

您可以檢查FacesContext#isValidationFailed()了點。

public void viewAction() { 
    if (!FacesContext.getCurrentInstance().isValidationFailed()) { 
     // ... 
    } 
} 

當你手動執行驗證,而不是使用JSF標準Validator S表示目前還不清楚某些原因(你也知道,你可以指定一個validator<f:validator><f:validateXxx><f:viewParam>?),你需要在驗證失敗時手動調用FacesContext#validationFailed()

+0

您可能指定了viewAction(ComponentSystemEvent)而不是validateParams()。 – Zak

+0

我修復了方法名稱。我只是從代碼片段中複製而沒有多加關注。我只是回答標題中所述的問題:)方法參數是可選的。 – BalusC

+0

我使用了你的建議並修改了我的代碼。謝謝。 – Zak