2

PrimeFaces で単一選択できる衝突エンティティのリストがあります<p:datatable>。その下には、関連する履歴と添付ファイルを表示するフィールドセットがあります。

JSFページは次のとおりです(添付ファイルのデータテーブルは他のデータテーブルよりも重要です):

<h:panelGrid>

    <p:scrollPanel mode="native">
        <p:dataTable value="#{collisionManager.selectedCollisions}"
                     var="cln"
                     selection="#{collisionManager.selectedStateChangeCollision}" 
                     selectionMode="single"
                     rowKey="#{cln.id}"
                     paginator="true"
                     paginatorPosition="bottom"
                     rows="5">

            <p:ajax event="rowSelect" process="@this" update="@form" />

            <p:column headerText="ID">
                <h:outputText value="#{cln.id}" />
            </p:column>

            ...

        </p:dataTable>
    </p:scrollPanel>

    <p:fieldset legend="History and Attachments">

        <p:tabView widgetVar="stateChangeTabView"
                   dynamic="true"
                   cache="false">

            <p:tab title="History">
                ...
            </p:tab>

            <p:tab title="Attachments">
                <p:dataTable id="attachments-datatable"
                             value="#{attachmentManager.activeAttachments}"
                             var="att"
                             paginator="true"
                             paginatorPosition="bottom"
                             rows="3">

                    <p:column headerText="File Name">
                        <h:outputText value="#{att.fileName}" />
                    </p:column>

                    <p:column headerText="Deleted">
                        <h:outputText value="#{att.deleted}" />
                    </p:column>

                    <p:column headerText="Marked">
                        <h:outputText value="#{attachmentManager.markedToDelete(att)}" />
                    </p:column>

                    <p:column headerText="Actions">
                        <p:commandButton icon="ui-icon ui-icon-trash"
                                         title="Mark to delete"
                                         action="#{attachmentManager.markToDelete(att)}"
                                         process="@this"
                                         update="@form"
                                         rendered="#{not attachmentManager.markedToDelete(att)}">
                        </p:commandButton>
                        <p:commandButton icon="ui-icon ui-icon-cancel"
                                         title="Unmark to delete"
                                         action="#{attachmentManager.unmarkToDelete(att)}"
                                         process="@this"
                                         update="@form"
                                         rendered="#{not attachmentManager.markedToDelete(att)}">
                        </p:commandButton>
                    </p:column>
                </p:dataTable>
            </p:tab>

        </p:tabView>

    </p:fieldset>

</h:panelGrid>

<!-- SAVE + CANCEL buttons here -->

これがAttachmentManagerBean です (クラスパスには Seam 3 Faces が@Namedあり@Viewscoped、互換性がありますが、ここでは問題になりません):

@Named
@ViewScoped
public class AttachmentManager implements Serializable
{
    // attachments to be deleted
    private List<Attachment> markedAttachments;

    public void markToDelete( Attachment attachment )
    {
        if ( !this.markedAttachments.contains( attachment ) )
        {
            this.markedAttachments.add( attachment );
        }
    }

    public void unmarkToDelete( Attachment attachment )
    {
        this.markedAttachments.remove( attachment );
    }

    public boolean markedToDelete( Attachment attachment )
    {
        return this.markedAttachments.contains( attachment );
    }
}

問題は、ページの行 (添付ファイル テーブル) の式を評価するときに始まります。

<h:outputText value="#{attachmentManager.markedToDelete(att)}" />

上記のコードのどの式が実際に実行されるかは問題ではなく、基本的にすべて失敗します。

javax.el.ELException: /view/changeData.xhtml @184,102 value="#{not attachmentManager.markedToDelete(att)}": java.lang.ClassCastException: com.company.project.model.Attachment cannot be cast to com.company.project.model.Collision

スタックトレースがまったくないことに注意してください。少なくとも、スタックトレースを見つけることができたわけではありません。サーバーの応答 (AJAX) を調べたところ、いくつかの例外が時々飲み込まれていることに気付きましたが、何もありませんでした。

私の問題に関連する他の2つの投稿を見つけました(これも未解決です):

http://forum.primefaces.org/viewtopic.php?f=3&t=4270

http://forum.primefaces.org/viewtopic.php?f=3&t=5923

Q: EL 式の何が問題なのか知っている人はいます#{not attachmentManager.markedToDelete(att)}か?

Q2: スタック トレースはどこにあるのでしょうか。具体的には、どのように/どこで見つけることができますか?

私たちがいる環境は次のとおりです: GlassFish 3.1.2.2、Mojarra 2.1.6、PrimeFaces 3.4

4

1 に答える 1

0

サーバーの Mojarra をバージョン 2.1.14 に交換し、数回のリロード/再試行の後、スタックトレースが最終的に表示されました。(最初の数回の試行ではすべて同じでした。GlassFish が JAR の関連部分をキャッシュしている可能性があります)

その後は簡単でした。equals メソッドをCollisiontoからコピーし、toAttachmentのキャストをCollision変更せずに残しました。それがCCEの原因です。

ただし、スタックトレースがどこに行っていたのかはまだ謎です...

于 2012-10-24T12:18:09.140 に答える