2016-11-23 59 views
0

我有一個包含一個Notes文檔的XPage。本頁面的目的只是爲了顯示文件的一些相關領域。XPAges:「java.io.NotSerializableException:lotus.domino.local.Document」

第一次訪問頁面是好的。也是後來又顯示當不改變墊層文件就可以了。

但是,當我從這個導航到另一個XPage中,並更改文件存在(是的,我有致力於編輯文檔的另一頁),然後再回到「秀」頁面中,我得到了java.io.NotSerializableException在渲染響應階段。

奇怪:它是一個lotus.domino.local.Document ...我從來沒有想保存/序列化文檔...:-o

我所做找到我的代碼的bug:

  1. 我登錄了viewScope內容在beforeRenderResponse頁面的事件,但只有簡單的對象(字符串和布爾值)。
  2. 我設置頁面,以「nostate」視圖狀態。
  3. 我將頁面的只讀屬性設置爲「true」。
  4. 我刪除了所有的「在頁面加載」數據綁定(切換到「${...}」到「#{...}」)

所以,我還能做些什麼來找到的代碼點,其中一些類型的文檔想要被保存? 在這種情況下,典型的錯誤原因是什麼?

感謝您的幫助,以幫助自己! :-)

我的堆棧跟蹤:

23.11.16 10:30: Exception Thrown 
Context Path: /.../.../myApp.nsf 
Page Name: /page_ShowData.xsp 
com.ibm.xsp.FacesExceptionEx: java.io.NotSerializableException: lotus.domino.local.Document 
    at com.ibm.xsp.application.AbstractStateManager.saveSerializedView(AbstractStateManager.java:121) 
    at com.ibm.xsp.application.StateManagerImpl.saveSerializedView(StateManagerImpl.java:152) 
    at com.ibm.xsp.application.ViewHandlerExImpl._saveViewState(ViewHandlerExImpl.java:455) 
    at com.ibm.xsp.application.ViewHandlerExImpl.saveViewState(ViewHandlerExImpl.java:449) 
    at com.ibm.xsp.application.ViewHandlerExImpl._renderView(ViewHandlerExImpl.java:324) 
    at com.ibm.xsp.application.ViewHandlerExImpl.renderView(ViewHandlerExImpl.java:336) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:103) 
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:210) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:120) 
    at com.ibm.xsp.controller.FacesControllerImpl.render(FacesControllerImpl.java:270) 
    at com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:261) 
    at com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:157) 
    at com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:160) 
    at com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138) 
    at com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103) 
    at com.ibm.designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:588) 
    at com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1335) 
    at com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:865) 
    at com.ibm.designer.runtime.domino.adapter.ComponentModule$ServletInvoker.doService(ComponentModule.java:808) 
    at com.ibm.designer.runtime.domino.adapter.ComponentModule.doService(ComponentModule.java:577) 
    at com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1319) 
    at com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:662) 
    at com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:482) 
    at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:357) 
    at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:313) 
    at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272) 
Caused by: java.io.NotSerializableException: lotus.domino.local.Document 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
    at java.util.ArrayList.writeObject(ArrayList.java:728) 
    at sun.reflect.GeneratedMethodAccessor652.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1059) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1502) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
    at java.util.HashMap.writeObject(HashMap.java:942) 
    at sun.reflect.GeneratedMethodAccessor637.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:611) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1059) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1502) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179) 
    at java.io.ObjectOutputStream.writeUnshared(ObjectOutputStream.java:413) 
    at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:438) 
    at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417) 
    at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417) 
    at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417) 
    at com.ibm.xsp.application.AbstractSerializingStateManager$FastObjectOutputStream.writeObjectEx(AbstractSerializingStateManager.java:417) 
    at com.ibm.xsp.application.AbstractSerializingStateManager.saveSerializedView(AbstractSerializingStateManager.java:294) 
    at com.ibm.xsp.application.AbstractSerializingStateManager.doSaveSerializedView(AbstractSerializingStateManager.java:269) 
    at com.ibm.xsp.application.FileStateManager.doSaveSerializedView(FileStateManager.java:290) 
    at com.ibm.xsp.application.FileStateManager.doSaveSerializedView(FileStateManager.java:270) 
    at com.ibm.xsp.application.AbstractStateManager.saveSerializedView(AbstractStateManager.java:114) 
    ... 25 more 

我page_ShowData.xsp:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" pageTitle="Show Data" 
    xmlns:xc="http://www.ibm.com/xsp/custom" 
    xmlns:xe="http://www.ibm.com/xsp/coreex" readonly="true" 
    viewState="nostate" 
    afterPageLoad="#{javascript:print('page_ShowData.afterPageLoad()');}"> 
    <!-- ... --> 
    <xp:this.data> 
     <xp:dominoDocument var="stamm" formName="Masterdata" ignoreRequestParams="false"> 
      <xp:this.action> 
       <![CDATA[#{javascript: 
        // ensure to set the unid if known 
        if (viewScope.stammid == null){ 
         viewScope.stammid = param.get('documentId'); 
        } 

        if(typeof viewScope.stammid == "undefined" || viewScope.stammid == null || viewScope.stammid == ""){ 
         return; // empty means 'create' 
        } else { 
         return 'openDocument'; 
        } 
       }]]> 
      </xp:this.action> 
      <xp:this.documentId> 
       <![CDATA[#{javascript:return viewScope.stammid;}]]> 
      </xp:this.documentId> 


      <xp:this.postOpenDocument> 
       <![CDATA[#{javascript: 
        <!-- set some viewScope vars --> 
       }]]> 
      </xp:this.postOpenDocument> 

      <xp:this.postNewDocument> 
       <![CDATA[#{javascript: 
        <!-- set some viewScope vars --> 
       }]]> 
      </xp:this.postNewDocument> 
     </xp:dominoDocument> 
    </xp:this.data> 

    <!-- ... --> 

    <xp:this.beforeRenderResponse> 
    <![CDATA[#{javascript: 
     try{ 
      // print all viewScope vars 
      var vsKeys:java.util.Set = viewScope.keySet(); 
      for (var k in vsKeys){ 
       var v = viewScope.get(k); 
       print('viewScope - ['+k.toString()+'] (serializable='+(k instanceof java.io.Serializable)+') = ['+v+'] (instance='+(typeof v)+', serializable='+(v instanceof java.io.Serializable)+')'); 
      } 
    }]]> 

    </xp:this.beforeRenderResponse> 



    <!-- some UI content --> 

</xp:view> 

回答

3

在你存儲NotesDocument的(不DominoDocument數據源這兩個的XPages之一,但NotesDocument的對象)在一個作用域變量中。 Domino對象不可序列化,這就是拋出錯誤的原因。最有可能的地方是你正在移動的頁面

如果您需要訪問特定文檔,請將文檔的UNID存儲在作用域變量中,並使用database.getDocumentByUNID()來檢索它。這幾乎可以肯定DominoDocument數據源的功能。

+0

好了,感謝您的評論。我已經知道我不能將NotesDocument存儲在範圍變量中。這就是爲什麼我將viewScope vars作爲查找錯誤的第一步。但所有的變量都是布爾值或字符串......實際上,我不想保存或緩存文檔。問題是,如何找到將文檔放入範圍的代碼片段......但是您提供了一個很好的提示:我只查看了我的_target_頁面(只讀的頁面),也許我必須查看我的_source_頁面(可編輯的)。我稍後會在這裏寫下我的結果...... – Reeny

+1

是否有可能它可能是某個UIControl或DataSource具有可解析爲NotesDocument的計算屬性?即而不是範圍變量。 也許一個線索是,writeObjectEx在它的第6次遞歸中,所以想一想在範圍/控制樹中大約6深處的東西。你是否100%確定錯誤來自於顯示頁面?如果您從編輯頁面切換回來,編輯頁面是否會被序列化? –

+0

所以。你們都是對的:錯誤來自_target_頁面。有一位同事進行了自定義控制。他有一個NotesDocument作爲(計算)的數據源。他發現了這個錯誤,並在我跳出窗前向我報告:-)感謝您的幫助! – Reeny