Pregunta

He siguiente código en la página JSF, respaldado por el bean administrado JSF

<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>

Este fragmento de código se dedica a la edición de colección alcanzado la mayoría de artículos. Cada fila de la tabla contiene el botón "editar" que somete cambian los valores de la fila en el servidor. Tiene el artículo en sí mismo como un atributo. Enviar se realiza por el método actionListener llamando en el bean de respaldo administrado.

Este código se ejecuta correctamente en Glassfish v 2.1

Pero cuando el servidor se ha actualizado para Glassfish v 2.1.1, el atributo se detuvo para pasar correctamente. En lugar de pasar elemento editado (cuando cambiamos los valores de la fila de la tabla, en realidad estamos cambiando los campos del objeto subyacente), el elemento de origen se envía al servidor, es decir, el elemento que se ha dado con anterioridad a la página. Todos los cambios que se realizaron en la página se descartan.

Me trató de la versión JSF actualización desde 1.2_02 a 1.2_14 (estamos utilizando JSF RI), pero no tuvo ningún efecto.

Tal vez alguien se encontró con el mismo problema? Se apreciará cualquier ayuda y sugerencias.

¿Fue útil?

Solución

barcos Glassfish con JSF incluido. GlassFish v2.1.1 con Mojarra 1.2_13 . En realidad no necesita tener sus propias bibliotecas JSF en el /WEB-INF/lib. No estoy seguro de cómo se produce este problema en particular, pero para empezar, es necesario asegurarse de que usted no tiene colisiones versión JSF en la ruta de clase.

Dicho esto, la preferida JSF 1.2 manera de pasar propiedades del bean es 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>

Actualizar : Recuerdo algo; este problema sugiere que todavía tiene una versión JSF 1.2 mayor que 1.2_05 vueltas en la ruta de clase. La manipulación de atributos del componente ha cambiado según esta versión a favor de mejoras en el rendimiento. En pocas palabras, si usted tiene un jsf-api.jar de mayores de 1.2_05 en la ruta de clases, mientras que hay una jsf-impl.jar de 1.2_05 o posterior en la ruta de clases, usted experimentará exactamente este problema.

La solución es obvia: la limpieza de la ruta de clases para deshacerse de la versión JSF más. Caminos cubiertos por la ruta de clase por defecto de la aplicación web están bajo cada /WEB-INF/lib, Appserver/lib (que es en el caso de algún lugar en Glassfish Appserver/domains/domainname/*) y el JRE/lib y JRE/lib/ext. Tenga en cuenta que javaee.jar de Glassfish incluye bibliotecas JSF, así, por lo que realmente necesita para asegurarse de que usted no tiene que JAR (o cualquier otro archivo JAR-servidor de aplicaciones específicas) en su /WEB-INF/lib o en otro lugar.

Otros consejos

Se puede añadir JBoss EL y escribir:

#{poolBean.updatePool(item)}

no necesita toda la costura de eso, está bien trabaja con JSF RI.

Probablemente tiene que ver con la forma en JSF 1.2 implementos actionListener. En JSF 1.1 y hasta hace pocos implementaciones de JSF 1.2 (RichFaces, Trinidad, etc.) la orden era setPropertyActionListener (o atributo) -> actionListener -> acción. En JSF 1.2 y ahora implementado en RichFaces y Trinidad (no estoy seguro sobre IceFaces) el orden es actionListener -> setPropertyActionListener (o atributo) -> acción. Sé que es preocupante y muy molesto ... Que pensaban de la misma? ¿Qué es lo que tienen en mente? De todos modos, trate de usar una acción en lugar de un actionListener y ver si funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top