Принятие отправки формы без выбора переключателя

Я пишу приложение с Java EE, используя JSF 1.2 и платформу Seam. У меня есть форма, которая принимает ввод от переключателя следующим образом:

<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 отклоняет отправку и приводит к ошибке проверки. Я попытался написать для него собственный валидатор, но, к сожалению, у меня это тоже не сработало.

Любое предложение?


person Sazzadur Rahaman    schedule 21.11.2012    source источник
comment
Что такое ошибка проверки. Я не вижу, что вы используете проверки здесь. Не могли бы вы предоставить соответствующие строки из трассировки стека и подпись метода setSelectedOptionId().   -  person prageeth    schedule 22.11.2012
comment
После отправки формы в jsf (известной как обратная передача) включаются различные события жизненного цикла, такие как значение привязки, проверка. и эти фазовые события выполняются в любом обычном потоке, прежде чем перейти к этапу приложения, в котором находятся коды логики нашего приложения. Дело в том, что валидатор переключателя отклоняет значение, когда переключатель не выбран, и снова перенаправляет на форму.   -  person Sazzadur Rahaman    schedule 22.11.2012
comment
Описанная проблема может возникнуть только в том случае, если у вас есть required="true" на <h:selectOneRadio>, но у вас его нет. Пока код выглядит нормально. Он отлично работает для меня. Проблема вызвана другим. SSCCE очень поможет.   -  person BalusC    schedule 23.11.2012
comment
Спасибо @BaluC! Да, проблема должна возникнуть при require="true", но в моем случае я не понимаю, почему это происходит. Но я нашел обходной путь.   -  person Sazzadur Rahaman    schedule 23.11.2012


Ответы (1)


Я не нашел решения этой проблемы, написав собственный валидатор, который должен быть идеальным решением в этом случае. Но я нашел обходной путь, чтобы преодолеть эту ситуацию. Я могу обойти этапы значения привязки и проверки, установив immediate = "true" кнопки отправки следующим образом:

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

Выполняя это, пропуская последующие фазы, сервлет переходит к вызову фазы приложения, и логика вашего приложения будет применена, и, поскольку вы пропустили фазы обработки, данные из вашего почтового запроса не будут привязаны к вашим bean-компонентам. Итак, прежде чем работать с этими 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));
        }
    }

а затем применил мою реальную бизнес-логику.

person Sazzadur Rahaman    schedule 23.11.2012