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 -->
これがAttachmentManager
Bean です (クラスパスには 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