我正在尝试使用nomComposantARejouer
(我们使用jsf 1.2)将两个参数(即typeFileARejouer
,gestionnaireMessagesController.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.
}
我不确定自己错了什么。有人可以帮忙吗?
仅供参考,变量nomComposant
和typeFile
可以毫无问题地显示,并且不为空。
还要忽略h:columnHeaderFacet标记。它们是我重命名的内部标签。
答案 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