我們有一個碰撞實體列表,您可以在PrimeFaces <p:datatable>
中單獨選擇。在那之下是一個顯示相關歷史和文件附件的字段集。PrimeFaces dataTable:由ClassCastException引發的奇怪ELException(無堆棧跟蹤)使用GlassFish + Mojarra
這裏的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
豆(有接縫在類路徑@Named
和@Viewscoped
3面是兼容的,不應該不管這裏):
@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),我們注意到有些異常有時會被吞噬 - 什麼都沒有。
我發現有關我的問題,其他兩個職位(未解,太):
http://forum.primefaces.org/viewtopic.php?f=3&t=4270
http://forum.primefaces.org/viewtopic.php?f=3&t=5923
問: 有誰知道什麼可能是錯的EL表達式#{not attachmentManager.markedToDelete(att)}
?
Q2: 堆棧跟蹤哪裏可以消失或更具體地說,我怎麼找到它?
我們的環境是:GlassFish的3.1.2.2,鑽嘴魚科2.1.6,PrimeFaces 3.4
有趣。如果你用'Object'替換參數類型'Attacument'?然後在第一行放置一個調試斷點,以查看真正傳入的內容,並探究執行此操作的調用堆棧。 – BalusC