0

メソッド呼び出しを介してPrimafaces出力ラベルに入力することについて質問があります。このメソッドにはパラメーターも必要でした。

ラベルは次のようになります。

<p:dataTable id="answerToQuestionDialogTable" var="answer" value="#{allQuestionBean.answers}">
    <p:column headerText="Counts For this Answer">
        <p:outputLabel value="#{allQuestionBean.votingCounter}">
            <f:param name="id" value="#{answer.answerId}"/>
        </p:outputLabel>
    </p:column>
 </p:dataTable>

私のバッキングBeanには、「votingCounter」という名前の整数フィールドがあり、その後にゲッターが続きます。

public int getVotingCounter() {
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        int answerID = Integer.parseInt(params.get("id"));

        return answeredDAO.getCountForAnswer(answerID);
    }

サイトを読み込もうとすると、AppServer(Tomcat 6)から次のLogOutputが表示されます。

04.09.2012 04:30:47 com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback visit
SCHWERWIEGEND: javax.el.ELException: /pages/allQuestion.xhtml @69,81 value="#{allQuestionBean.votingCounter}": Error reading 'votingCounter' on type bean.view.AllQuestionBean

なぜこれが機能しないのかを誰かに説明してもらえますか?また、メソッドを呼び出してラベルをテキストで埋める方法を教えてもらえますか?

4

3 に答える 3

1

まず、スタック トレースの根本原因を読んで、具体的な問題の根本原因を理解する必要があります。スタック トレースの根本的な原因は、スタック トレースの一番下の部分です。

NullPointerExceptionあなたの特定のケースでは、行おうとしている行を指しているのはおそらく普通のことですInteger.parseInt(params.get("id"))。この例外の根本原因は、具体的な問題についてより多くを物語っています。返されたということparams.get("id")null、基本的には<f:param>このように機能しないことを意味します。

実際、これは の目的ではありません<f:param>getRequestParameterMap()は、実際の HTTP リクエスト パラメータを返します。任意のコンポーネントに埋め込んだ値ではなく、その<f:param>リクエストでのみ使用可能なパラメータを持つ URL を指すリンク/ボタンを生成しません(現在のリクエストでは使用できません!)。 .

代わりに、ダニエルの提案に従ってソリューションを実装するかvotingCounterAnswerクラスに移動するか、次のような代替アプローチを実装する必要があります。

public int getVotingCounter() {
    FacesContext context = FacesContext.getCurrentInstance();
    Integer answerID = context.getApplication().evaluateExpressionGet(context, "#{answer.answerId}", Integer.class);
    return answeredDAO.getCountForAnswer(answerID);
}
于 2012-09-04T11:10:45.463 に答える
-1

次のようにしてみてください。ゲッターとセッターがあると仮定しますvotingCounter

<p:dataTable id="answerToQuestionDialogTable" var="answer" value="#{AllQuestionBean.answers}">
    <p:column headerText="Counts For this Answer">
        <p:outputLabel value="#{AllQuestionBean.votingCounter}">
            <f:param name="id" value="#{answer.answerId}"/>
        </p:outputLabel>
    </p:column>
 </p:dataTable>
于 2012-09-04T04:33:35.530 に答える