XPAges:"java.io.NotSerializableException: lotus.domino.local.Document"

XPAges: "java.io.NotSerializableException: lotus.domino.local.Document"

我有一个 XPage,其中包含一个 Notes 文档。此页面的目的只是显示 文档的一些相关字段。

第一次访问该页面是可以的。并且稍后再次显示时 无需 更改底层文档即可。

但是当我从这个导航到另一个 XPage,并在那里更改文档时(是的,我有另一个页面专门用于 编辑 文档),然后返回到"show" 页面,我在渲染响应阶段得到 java.io.NotSerializableException

奇怪:它是为了一个lotus.domino.local.Document ...我从来不想save/serialize一个文件...:-o

我为找到代码中的错误所做的工作:

  1. 我在页面的beforeRenderResponse事件中记录了viewScope内容,但是只有简单的对象(字符串和布尔值)。
  2. 我把页面的viewState设置为“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>

在这两个 XPage 之一上,您将 NotesDocument(不是 DominoDocument 数据源,而是 NotesDocument 对象)存储在一个作用域变量中。 Domino 对象不可序列化,这是引发错误的原因。最有可能的位置是您要从 .

移动的页面

如果您需要访问特定文档,请将文档的 UNID 存储在作用域变量中并使用 database.getDocumentByUNID() 进行检索。这几乎肯定是 DominoDocument 数据源所做的。