2012-11-21 97 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)); 
     } 
    } 

,然后应用我真正的业务逻辑。

相关问题