0

私は、primefaces 3.5、Glassfish 3.1.2、および Java EE を使用しています。表に「質問」を作成するページを作成しようとしています。ユーザーが質問に答えようとするときに選択する「回答」を含むデータテーブルがあります。

多肢選択式の雑学クイズであるため、1 つ以上の答えが正しく、残りが正しい必要があります。質問ごとに 2 ~ 6 の回答があり、最大 4 つの正解があることを許可しています。したがって、回答を保持する ap:dataTable 要素があり、テーブル内の回答を追加、削除、または編集する 3 つの commandButtons があり、それぞれにクリック時に実行されるサーバー側メソッドがあります。ただし、どのメソッドも実行されません。エラーも例外もありません。何も機能しません。

これが私のページです(他の場所でエラーが発生した場合に備えて、ページ全体を含めています):

<h:form id="createQForm">
    <h1>Create A Question</h1>
    <p:messages id="msgs"/>  
    <p:selectOneMenu 
        value="#{createQuestionBean.selectedCategory}"  
        id="lstCategory" required="true" >

        <f:selectItems 
            value="#{createQuestionBean.categories}" />
        <p:ajax listener="#{createQuestionBean.onSelectCategory}" 
                update="lstSubCategory" />
    </p:selectOneMenu>
    <p:selectOneMenu 
        value="#{createQuestionBean.selectedSubCategory}"  
        id="lstSubCategory" required="false">

        <f:selectItem itemLabel="No Sub-Category" 
                      noSelectionOption="true" />

        <f:selectItems 
            value="#{createQuestionBean.subCategories}"/>

    </p:selectOneMenu>
    <h:panelGrid  columns="3">
        <h:outputLabel for="txtQuestion" id="lblQuestion" value="Question: *" />
        <p:inputText value="#{createQuestionBean.entry.question}"
                     id="txtQuestion" required="true" 
                     requiredMessage="You must provide a question"
                     validatorMessage="#{createQuestionBean.QUESTION_VALIDATION_MESSAGE}">
            <f:validateRegex pattern=".*[\s\d\w]"  />
            <p:ajax update="msgQuestion" event="keyup" />
        </p:inputText>
        <p:message for="txtQuestion" id="msgQuestion" display="icon"/> 
    </h:panelGrid>
    <h:outputText value="Horizontal: " />  

    <p:selectManyCheckbox value="#{createQuestionBean.selectedOptions}">  
        <f:selectItem itemLabel="Randomizable?" itemValue="randomizable" />  
        <f:selectItem itemLabel="Multiple Choice?" itemValue="multichoice" />  
    </p:selectManyCheckbox> 


    <p:fileUpload 
        value="#{createQuestionBean.questionImage}" mode="simple" 
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/" 
        label="Select Images (jpg or png)" 
        sizeLimit="2097152" 
        invalidFileMessage="Sorry, only files of type .jpg, .png or .gif are allowed" 
        invalidSizeMessage="Sorry, files are limited in size to 2 Mb"/>
    <p:dataTable 
        id="answersTable" var="answer" style="width: 250px"
        value="#{createQuestionBean.datamodel}"   
        selection="#{createQuestionBean.selectedAnswer}"
        editMode="cell" editable="true"
        selectionMode="single">

        <p:column style="width:75%"> 
            <p:cellEditor >  
                <f:facet name="output">
                    <h:outputText 
                        value="#{answer.answer.testAnswer}" />
                </f:facet>  
                <f:facet name="input">
                    <p:inputText 
                        id="modelInput"  
                        style="width: 97%;height: 97%"
                        value="#{answer.answer.testAnswer}"/>
                </f:facet>  
            </p:cellEditor>  
        </p:column>
        <p:column style="width:25%">  
            #{answer.correct ? "Correct" : "Wrong" }  
        </p:column>

    </p:dataTable>
    <h:panelGrid columns="3">
        <p:commandButton 
            update="answersTable" ajax="true"
            actionListener="#{createQuestionBean.removeSelect}"
            value="Remove Selected -"/>
        <p:commandButton
            update="answersTable" ajax="true"
            actionListener="#{createQuestionBean.setAsCorrect}"
            value="Set Selected As Right"/>
        <p:commandButton 
            update="answersTable" ajax="true"
            value="Add +"
            actionListener="#{createQuestionBean.addAnswer}"/>

    </h:panelGrid>
    <p:commandButton
        action="#{createQuestionBean.saveAndStoreEntry()}" />
</h:form>

呼び出されるメソッドは次のとおりです。

public void addAnswer() {
    System.out.println("***** CALLED ADD ANSWER");
    answers.add(new QuestionAnswers());
    answers.get(answers.size() - 1).setCorrect(false);
    setIDs();
    //set the data models
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers));
}

public void removeSelect() {
    System.out.println("***** CALLED REMOVE SELECT");
    if (selectedAnswer == null && !answers.contains(selectedAnswer)) {
        FacesUtils.addErrorMessage(NO_SELECTION_ERROR);
    } else {
        answers.remove(selectedAnswer);
    }
    setIDs();
    //set the data models
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers));
}

public void setAsCorrect() {
    System.out.println("***** CALLED SET AS CORRECT");
    if (selectedAnswer != null) {
        selectedAnswer.setCorrect(true);
        if (!entry.getMultichoice()) {
            for (QuestionAnswers questionAnswers : answers) {
                if (questionAnswers != selectedAnswer) {
                    questionAnswers.setCorrect(false);
                }
            }
        }
    } else {
        FacesUtils.addErrorMessage(NO_SELECTION_ERROR);
    }
    setIDs();

    //set the data models
    datamodel = new QuestionAnswersDataModel(new ArrayList<QuestionAnswers>(answers));
}

各メソッドにブレークポイントを追加して、システム出力とともに、それが呼び出されたかどうかを確認しました。

私は何を間違っていますか?メソッド呼び出しに AjaxBehaviourEvent がなかったためかもしれませんが、何も変わりませんでした。

4

1 に答える 1

0

私はそれが何であるかを知りました。各要素を削除したところ、それが入力テキスト ボックスにあることがわかりました。バリデーターを削除しましたが、まだ機能しませんでした。次に、検証が必要だとは決して言わなかったにもかかわらず、エンティティ検証を使用していたことがわかります (IE、null または空白にすることはできません)。ボックスにテキストを入れると、メソッドはエラーなしで実行されました。

于 2013-04-23T22:07:30.037 に答える