JSF命令按钮属性传输不正确

JSF命令按钮属性传输不正确,jsf,glassfish,actionlistener,Jsf,Glassfish,Actionlistener,我在jsf页面中有以下代码,由jsf托管bean支持 <h:dataTable value="#{poolBean.pools}" var="item"> <h:column> <f:facet name="header"> <h:outputLabel value="Id"/> </f:facet> <h:outputText value

我在jsf页面中有以下代码,由jsf托管bean支持

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

此代码片段专用于编辑项目集合。表的每一行都包含“编辑”按钮,用于将行的更改值提交给服务器。它将项目本身作为属性。提交是通过在后台托管bean中调用actionListener方法来执行的

此代码在Glassfish V2.1上正确运行

但是,当服务器更新到Glassfish v 2.1.1时,该属性停止正确传递。源项不是传递已编辑的项(当我们更改表行中的值时,实际上是在更改基础对象字段),而是提交给服务器,即以前提供给页面的项。在页面上所做的所有更改都将被放弃

我试图将jsf版本从1.2_02更新到1.2_14(我们正在使用jsf RI),但没有效果


也许有人遇到过同样的问题?任何帮助和建议都将不胜感激。

装有捆绑JSF的Glassfish船舶。实际上,您不需要在
/WEB-INF/lib
中拥有自己的JSF库。我不确定这个问题是如何引起的,但首先,您需要确保类路径中没有JSF版本冲突


也就是说,传递bean属性的首选JSF1.2方法是使用
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>

更新:我想起了一些事情;这个问题表明类路径中仍然有比1.2_05旧的JSF1.2版本。组件属性的处理已根据此版本更改,以支持性能增强。简而言之,如果类路径中的
jsfapi.jar
早于1.2_05,而类路径中的
jsf impl.jar
早于1.2_05或更高版本,那么您将遇到这个问题


解决方案显而易见:清理类路径以摆脱旧的JSF版本。webapp的默认类路径覆盖的路径位于每个
/WEB-INF/lib
Appserver/lib
(以
Appserver/domains/domainname/*
中的Glassfish为例)和
JRE/lib
JRE/lib/ext
下。请记住Glassfish的
javaee.jar
也包括JSF库,因此您确实需要确保您的
/WEB-INF/lib
或其他地方没有该jar(或任何其他特定于appserver的jar文件)。

Glassfish附带了捆绑的JSF。实际上,您不需要在
/WEB-INF/lib
中拥有自己的JSF库。我不确定这个问题是如何引起的,但首先,您需要确保类路径中没有JSF版本冲突


也就是说,传递bean属性的首选JSF1.2方法是使用
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>

更新:我想起了一些事情;这个问题表明类路径中仍然有比1.2_05旧的JSF1.2版本。组件属性的处理已根据此版本更改,以支持性能增强。简而言之,如果类路径中的
jsfapi.jar
早于1.2_05,而类路径中的
jsf impl.jar
早于1.2_05或更高版本,那么您将遇到这个问题

解决方案显而易见:清理类路径以摆脱旧的JSF版本。webapp的默认类路径覆盖的路径位于每个
/WEB-INF/lib
Appserver/lib
(以
Appserver/domains/domainname/*
中的Glassfish为例)和
JRE/lib
JRE/lib/ext
下。请记住,Glassfish的
javaee.jar
也包括JSF库,因此您确实需要确保您的
/WEB-INF/lib
或其他地方没有该jar(或任何其他特定于appserver的jar文件)。

您可以添加并编写:

#{poolBean.updatePool(item)}
您不需要整个Seam,可以与JSF RI配合使用。

您可以添加并编写:

#{poolBean.updatePool(item)}

您不需要整个Seam,它可以与JSF RI配合使用。

可能与JSF 1.2实现actionListener的方式有关。 在JSF1.1中,直到最近的JSF1.2实现(Richfaces、Trinidad等),顺序是setPropertyActionListener(或Attribute)->actionListener->action。 在JSF1.2中,现在在Richfaces和Trinidad中实现(不确定IceFaces),顺序是actionListener->setPropertyActionListener(或Attribute)->action。 我知道这很烦人,很烦人。。。 谁想到的?他们在想什么?
无论如何,尝试使用一个动作而不是actionListener,看看它是否有效。

这可能与JSF1.2实现actionListener的方式有关。 在JSF1.1中,直到最近的JSF1.2实现(Richfaces、Trinidad等),顺序是setPropertyActionListener(或Attribute)->actionListener->action。 在JSF1.2中,现在在Richfaces和Trinidad中实现(不确定IceFaces),顺序是actionListener->setPropertyActionListener(或Attribute)->action。 我知道这很烦人,很烦人。。。 谁想到的?他们在想什么?
无论如何,试着用一个动作来代替actionListener,看看它是否有效。

非常感谢您的建议。我从应用程序中删除了所有jsf库,并下载了Glassfish的干净版本。在server.log中,我可以清楚地看到我的应用程序正在使用捆绑的jsf库:初始化Mojara(1.2_13-b01-