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”的整数字段,并带有以下 Getter:

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

2

既然您无论如何都要为所有答案带来所有计数答案,为什么不创建一个地图并将其填充到您的地图中并 @PostConstruct以简单的方式访问它,例如

<p:outputLabel value="#{AllQuestionBean.countForAnserMap[answer.answerId]}">
于 2012-09-04T06:57:13.097 回答
1

首先,您应该阅读堆栈跟踪的根本原因以了解具体问题的根本原因。堆栈跟踪的根本原因是堆栈跟踪的最底部。

在您的特定情况下,它可能只是一个普通的NullPointerException指向您尝试执行的行Integer.parseInt(params.get("id"))。这个异常的根本原因更多地说明了具体问题。这说明params.get("id")返回null的内容基本上意味着<f:param>不能以这种方式工作。

事实上,这根本不是这个目的<f:param>。返回真正的getRequestParameterMap()HTTP 请求参数,而不是<f:param>您嵌入在任意组件中的值,该组件不会生成链接/按钮,该链接/按钮指向带有仅在请求中可用的参数的 URL(而不是当前请求!) .

相反,您应该按照 Daniel 的建议实施解决方案,或者将其votingCounter移至Answer类,或实施替代方法,如下所示:

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

尝试如下,假设你有getter和settervotingCounter

<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 回答