2012-11-21 154 views
0

我正在使用JSF 1.2和Seam框架編寫Java EE應用程序。我有一個表格這需要輸入從單選按鈕這樣的:接受表單提交時未選擇任何單選按鈕

<h:selectOneRadio value="#{testAction.selectedOptionId}" 
       id="selectedQuestionOption" 
       layout="pageDirection"> 
    <s:selectItems var="selectedOption" value="#{currentQuestion.options}" 
        label="#{selectedOption.optionString}" 
        itemValue="#{selectedOption.optionId}"/> 
</h:selectOneRadio> 

<h:commandButton id="goToNextQuestion" value="Submit" 
       action="#{testAction.postAnswer}"/> 

我想的是,如果有人提交表單,而不選擇一個單選按鈕,我會接受的結果,但它不工作。因爲在驗證階段,jsf拒絕提交併導致驗證錯誤。我試圖爲它寫一個自定義的驗證器,不幸的是,這也沒有爲我工作。

有什麼建議嗎?

+0

什麼是驗證錯誤。我看不到你在這裏使用驗證。你能否提供來自堆棧跟蹤的相關行和'setSelectedOptionId()'方法的簽名。 – prageeth

+0

以jsf(這被稱爲回發)提交表單後,將包含不同的生命週期事件,如綁定值,驗證。並且這些階段事件在任何正常流程中執行,然後再調用我們的應用程序邏輯代碼駐留的應用程序階段。事情是單選按鈕驗證器拒絕值,當沒有單選按鈕被選中並重新導向到窗體。 –

+0

所描述的問題只會在''有'required ='true''時出現,但是你沒有。代碼看起來很好。這對我來說可以。這個問題在其他地方引起。 SSCCE會有很大的幫助。 – BalusC

回答

0

我沒有找到任何解決方案,通過編寫一個自定義驗證器,這應該是在這種情況下理想的解決方案。但是我找到了解決這個問題的方法。我可以通過這樣的提交按鈕的設置immediate = "true"繞過結合價值和驗證階段:

<h:commandButton id="goToNextQuestion" value="Submit" immediate="true" 
      action="#{testAction.postAnswer}"/> 

通過這樣做跳過隨後階段面臨的servlet會去調用應用階段,你的應用程序邏輯將被應用,併爲您跳過了處理階段,您的發佈請求中的數據將不會綁定到您的bean。因此,與那些豆的工作之前,你應該從RequestParameterMap讀出自己的價值,像我一樣波紋管(在我的情況):

Map<String, String> paramMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 

    for (String key : paramMap.keySet()) { 
     //log.info("Param: " + key + " Value: " + paramMap.get(key)); 
     if (key.contains("selectedQuestionOption")) { 
      //log.info("OptionParam: " + key + " Value: " + paramMap.get(key)); 
      selectedOptionId = Integer.parseInt(paramMap.get(key)); 
     } 
    } 

,然後應用我真正的業務邏輯。

相關問題