2012-10-24 26 views
2

我們有一個碰撞實體列表,您可以在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

+0

有趣。如果你用'Object'替換參數類型'Attacument'?然後在第一行放置一個調試斷點,以查看真正傳入的內容,並探究執行此操作的調用堆棧。 – BalusC

回答

0

我用2.1.14版本交換服務器的鑽嘴魚科和幾個重裝後/重試堆棧跟蹤終於出現了。 (上接第幾次嘗試這一切都是一樣的,也許GlassFish的緩存它的JAR文件中的相關部分)

之後,因爲它可能已經很容易:我抄襲了equals方法從CollisionAttachment並留下投給Collision不變。這就是CCE的原因。

但是,堆棧跟蹤仍然是個謎......