質問

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 v 2.1 で正しく実行されます。

しかし、サーバーが Glassfish v 2.1.1 に更新されると、属性が正しく渡されなくなりました。編集されたアイテムを渡す代わりに (テーブル行の値を変更すると、実際には基礎となるオブジェクトフィールドが変更されます)、ソースアイテムがサーバーに送信されます。以前にページに与えられたアイテム。ページ上で行われたすべての変更は破棄されます。

jsf バージョンを 1.2_02 から 1.2_14 に更新しようとしました (jsf RI を使用しています) が、効果はありませんでした。

おそらく誰かが同じ問題に遭遇したでしょうか?助けや提案をいただければ幸いです。

役に立ちましたか?

解決

Glassfish には JSF がバンドルされて出荷されます。 Glassfish v2.1.1 は Mojarra 1.2_13 に同梱されています. 。実際には、独自の JSF ライブラリを /WEB-INF/lib. 。この特定の問題がどのように発生するのかはわかりませんが、まず、クラスパス内に JSF バージョンの競合がないことを確認する必要があります。

そうは言っても、Bean プロパティを渡す JSF 1.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 よりも古い JSF 1.2 バージョンがクラスパス内にまだ存在していることを示唆しています。このバージョンでは、パフォーマンスの向上を優先して、コンポーネント属性の処理が変更されました。一言で言えば、もしあなたが持っているなら、 jsf-api.jar クラスパスに 1.2_05 より古いものがある一方で、 jsf-impl.jar クラスパスに 1.2_05 以降が含まれている場合、まさにこの問題が発生します。

解決策は明らかです。クラスパスをクリーンアップして、古い JSF バージョンを削除します。Web アプリのデフォルトのクラスパスでカバーされるパスは、それぞれの下にあります。 /WEB-INF/lib, Appserver/lib (これは Glassfish の場合です。 Appserver/domains/domainname/*) そしてその JRE/lib そして JRE/lib/ext. 。Glassfish のことを覚えておいてください。 javaee.jar JSF ライブラリも含まれているため、その JAR (またはその他のアプリサーバー固有の JAR ファイル) がファイル内に存在しないことを確認する必要があります。 /WEB-INF/lib または別の場所にあります。

scroll top