0

nomComposantARejouer正在尝试typeFileARejouer使用gestionnaireMessagesController.rejouerMessagesetPropertyActionListener(我们使用jsf 1.2)

下面是相关的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 方法中使用时两个参数都为空:

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 标签。它们是我重命名的内部标签。

4

2 回答 2

2

你基本上在做:

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

在表单提交的调用操作阶段。这两个属性都在同一个bean 实例中,并在调用 action 方法之前不久复制。这是没有意义的。您似乎期望value在显示表单的请求期间对其进行评估。您似乎在考虑<f:setPropertyActionListener>设置请求参数。这不是真的。<f:param>是唯一这样做的。

所以,这应该做,

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

结合以下<managed-bean>gestionnaireMessagesControllerin 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>

(如有必要,您可以删除ARejouer以便它重用相同的属性)

于 2011-11-14T15:14:31.567 回答
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

于 2011-11-14T14:35:35.103 回答