Domanda

Ho seguente codice nella pagina JSF, sostenuta da JSF bean gestito

<h:dataTable value="#{poolBean.pools}" var="item">
    <h:column>
        <f:facet name="header">
                <h:outputLabel value="Id"/>  
        </f:facet>
        <h:outputText value="#{item.id}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputLabel value="Start Range"/>
        </f:facet>
        <h:inputText value="#{item.startRange}" required="true"/>               
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="End Range"/>
        </f:facet>
        <h:inputText value="#{item.endRange}" required="true"/>                            
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="Pool type"/>
        </f:facet>            
        <h:selectOneMenu value="#{item.poolType}" required="true">
            <f:selectItems value="#{poolBean.poolTypesMenu}"/>
        </h:selectOneMenu>
    </h:column>
    <h:column>
        <f:facet name="header"/>
        <h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
            <f:attribute name="pool" value="#{item}"/>
        </h:commandButton>
    </h:column>
</h:dataTable>

Questo frammento di codice è dedicato alla modifica raccolta venire di elementi. Ogni riga della tabella contiene tasto "modifica" che presenta cambiato valori della riga al server. Ha l'elemento stesso come attributo. Invia viene eseguita con il metodo ActionListener chiamando nel backing bean gestito.

Questo codice viene eseguito correttamente su Glassfish v 2.1

Ma quando il server è stato aggiornato per Glassfish v 2.1.1, l'attributo smesso di essere passato in modo corretto. Invece di passare elemento modificato (quando cambiamo i valori nella riga della tabella, in realtà stiamo cambiando i campi dell'oggetto sottostanti), l'elemento di origine viene inviato al server, cioè l'elemento che è stato precedentemente somministrato alla pagina. Tutte le modifiche che sono state fatte sulla pagina vengono scartati.

Ho cercato di versione JSF aggiornamento dal 1.2_02 a 1.2_14 (stiamo usando JSF RI), ma non ha avuto alcun effetto.

Forse qualcuno è venuto attraverso lo stesso problema? Qualsiasi aiuto e suggerimenti saranno apprezzati.

È stato utile?

Soluzione

navi Glassfish con JSF in bundle. navi Glassfish v2.1.1 con Mojarra 1.2_13 . In realtà non c'è bisogno di avere le proprie librerie JSF nel /WEB-INF/lib. Io non sono sicuro di come questo particolare problema è causato, ma per iniziare, è necessario assicurarsi che non si dispone di collisioni versione JSF nel classpath.

Detto questo, la preferita JSF 1.2 modo di passare proprietà del bean è usando f:setPropertyActionListener.

<h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
    <f:setPropertyActionListener target="#{poolBean.pool}" value="#{item}"/>
</h:commandButton>

Aggiorna : Mi ricordo qualcosa; questo problema suggerisce che avete ancora una versione JSF 1.2 vecchio di 1.2_05 giro nel classpath. Gestione degli attributi dei componenti è cambiato secondo questa versione a favore di miglioramenti delle prestazioni. In poche parole, se si dispone di un jsf-api.jar di età superiore ai 1.2_05 nel classpath, mentre c'è un jsf-impl.jar di 1.2_05 o più recente nel classpath, si verificherà esattamente questo problema.

La soluzione è ovvia: pulizia classpath per sbarazzarsi della versione più vecchia JSF. Percorsi coperti dal percorso di classe di default del webapp sono sotto ogni /WEB-INF/lib, Appserver/lib (che è in caso di qualche Glassfish in Appserver/domains/domainname/*) e la JRE/lib e JRE/lib/ext. Tenete a mente che javaee.jar di Glassfish include librerie JSF pure, così si ha realmente bisogno per garantire che non si dispone di quel vaso (o qualsiasi altro file JAR appserver-specifico) nel vostro /WEB-INF/lib o da qualche altra parte.

Altri suggerimenti

È possibile aggiungere JBoss EL e scrivere:

#{poolBean.updatePool(item)}

Non è necessario l'intero Seam per questo, funziona bene con JSF RI.

Probabilmente ha a che fare con il modo in JSF 1.2 implements ActionListener. In JSF 1.1 e fino a questi ultimi implementazioni di JSF 1.2 (RichFaces, Trinidad, ecc) l'ordine era setPropertyActionListener (o attributo) -> ActionListener -> azione. In JSF 1.2 ed ora implementato in RichFaces e Trinidad (non sono sicuro circa IceFaces) l'ordine è ActionListener -> setPropertyActionListener (o attributo) -> azione. So che è inquietante e molto fastidioso ... Chi ha pensato di esso? Che cosa hanno in mente? In ogni caso, provare a utilizzare un'azione invece di un ActionListener e vedere se funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top