Проблема с f: setPropertyActionListener и h: dataTable - PullRequest
0 голосов
/ 14 ноября 2011

Я пытаюсь передать два параметра, то есть (nomComposantARejouer, typeFileARejouer) методу действия (gestionnaireMessagesController.rejouerMessage), используя setPropertyActionListener (мы используем 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, потому что оба параметра равны нулю при использовании в методе действия:

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. Это внутренние теги, которые я переименовал.

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Вы в основном делаете:

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

во время фазы действия вызова формы отправки.Оба свойства находятся в том же экземпляре компонента и копируются незадолго до вызова метода действия.Это не имеет никакого смысла.Кажется, вы ожидаете, что value вычисляется во время запроса на отображение формы.Вы, кажется, думаете, что <f:setPropertyActionListener> устанавливает параметр запроса.Это неправда.<f:param> является единственным, который делает это.

Итак, это должно быть сделано,

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

в сочетании со следующим на <managed-bean> из gestionnaireMessagesController в 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, чтобы он снова использовал то же свойство)

1 голос
/ 14 ноября 2011

Я часто сталкивался с этой проблемой, это происходит, когда есть два 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

...