问题:f:setPropertyActionListener和h:dataTable

时间:2011-11-14 12:06:19

标签: jsf nullpointerexception jsf-1.2

我正在尝试使用nomComposantARejouer(我们使用jsf 1.2)将两个参数(即typeFileARejouergestionnaireMessagesController.rejouerMessage)传递给操作方法(setPropertyActionListener)。< / p>

以下是相关的jsp代码:

<h:column>
<h:columnHeaderFacet>
<h:columnHeader value="#{msgs['pilotage.coordinateur.libelle.rejouer']}" />
</h:columnHeaderFacet>
<h:commandLink id="rejouer"
value="#{msgs['pilotage.coordinateur.libelle.rejouer']}"
action="#{gestionnaireMessagesController.rejouerMessage}">
<f:setPropertyActionListener
target="#{gestionnaireMessagesController.nomComposantARejouer}"
value="#{gestionnaireMessagesController.nomComposant}" />
<f:setPropertyActionListener
target="#{gestionnaireMessagesController.typeFileARejouer}"
value="#{gestionnaireMessagesController.typeFile}" />
</h:commandLink>
</h:column>

但是,我总是得到一个NPE,因为在action方法中使用这两个参数都是null:

public String rejouerMessage() {
    log.debug("-->"+nomComposantARejouer);//null
    ParamResultatMessagesDTO message= (ParamResultatMessagesDTO) messagesTableau.getRowData();
    log.debug("MessageId: " + message.getMessageId());
    try {
        Pager p = Pager.getInstance();
        ParamRejouerMessageDTO prm = new ParamRejouerMessageDTO();
        prm.setMessageId(message.getMessageId());
        prm.setFileGet(nomsFilesMap.get(nomComposantARejouer).get(typeFileARejouer));
        prm.setFilePut(nomsFilesMap.get(nomComposantARejouer).get("TASKQ"));
        RejouerMessageService serv = (RejouerMessageService) this.getService(ServiceCst.REJOUER_MESSAGE_SERVICE);
        serv.rejouerMessage(prm);
    } catch (BusinessException e) {
        this.addMessage(e);
    } catch (ServiceException e) {
        this.addMessage(e);
    }


    return chargerPage(); // TODO Navigation case.
}

我不确定自己错了什么。有人可以帮忙吗?

仅供参考,变量nomComposanttypeFile可以毫无问题地显示,并且不为空。

还要忽略h:columnHeaderFacet标记。它们是我重命名的内部标签。

2 个答案:

答案 0 :(得分:2)

你基本上在做:

gestionnaireMessagesController.setNomComposantARejouer(gestionnaireMessagesController.getNomComposant());
gestionnaireMessagesController.setTypeFileARejouer(gestionnaireMessagesController.getTypeFile());

在表单提交的调用操作阶段。这两个属性都在相同 bean实例中,并在调用操作方法之前不久复制。这毫无意义。您似乎期望在显示表单的请求期间评估value。您好像在想<f:setPropertyActionListener>设置请求参数。这不是真的。 <f:param>是唯一能做到这一点。

所以,这应该做,

<f:param
    name="nomComposantARejouer"
    value="#{gestionnaireMessagesController.nomComposant}" />
<f:param
    name="typeFileARejouer"
    value="#{gestionnaireMessagesController.typeFile}" />

<managed-bean>gestionnaireMessagesController的{​​{1}}上的以下内容结合使用:

faces-conig.xml

(您可以根据需要删除<managed-property> <property-name>nomComposantARejouer</property-name> <value>#{param.nomComposantARejouer}</value> </managed-property> <managed-property> <property-name>typeFileARejouer</property-name> <value>#{param.typeFileARejouer}</value> </managed-property> ,以便重复使用相同的属性)

答案 1 :(得分:1)

我经常遇到这个问题,当有两个f:setPropertyActionListener时会发生这种情况。

你试试这种方式:

 <h:commandLink id="rejouer"
    value="#{msgs['pilotage.coordinateur.libelle.rejouer']}"
     action="#{gestionnaireMessagesController.rejouerMessage}"> <f:param
    name="nomComposant"
    value="#{gestionnaireMessagesController.nomComposant}"   />   
   <f:param name="typeFile"
    value="#{gestionnaireMessagesController.typeFile}" />   
  </h:commandLink>

请阅读此链接:http://www.coderanch.com/t/211274/JSF/java/Passing-param-commandLink