Jsf XPAges:“;java.io.NotSerializableException:lotus.domino.local.Document“;

Jsf XPAges:“;java.io.NotSerializableException:lotus.domino.local.Document“;,jsf,serialization,xpages,viewstate,Jsf,Serialization,Xpages,Viewstate,我有一个包含一个Notes文档的XPage。本页的目的只是显示文档的一些相关字段 第一次访问页面是可以的。而且,如果以后再次显示而不更改参考底图文档,也可以 但是当我从这个页面导航到另一个XPage,并在那里更改文档(是的,我有另一个专门编辑文档的页面),然后返回到“显示”页面时,我会在呈现响应阶段得到java.io.NotSerializableException 奇怪:它是用于lotus.domino.local.Document。。。我从不想保存/序列化文档…:-o 我如何在代码中找到bu

我有一个包含一个Notes文档的XPage。本页的目的只是显示文档的一些相关字段

第一次访问页面是可以的。而且,如果以后再次显示而不更改参考底图文档,也可以

但是当我从这个页面导航到另一个XPage,并在那里更改文档(是的,我有另一个专门编辑文档的页面),然后返回到“显示”页面时,我会在呈现响应阶段得到
java.io.NotSerializableException

奇怪:它是用于
lotus.domino.local.Document
。。。我从不想保存/序列化文档…:-o

我如何在代码中找到bug:

  • 我在页面的beforeRenderResponse事件中记录了viewScope内容,但只有简单的对象(字符串和布尔值)
  • 我将页面的viewState设置为“
    nostate
  • 我将页面的只读属性设置为“
    true
  • 我删除了所有“页面加载”数据绑定(将“
    ${…}
    ”切换为“
    {…}
    ”)
  • 那么,我还能做些什么来找到代码的点,在那里保存某种文档呢? 在这种情况下,典型的错误原因是什么

    谢谢你帮助我自己!:-)

    我的堆栈跟踪:

    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
    
    我的页面_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>
    
    
    }]]>
    }]]>
    
    在这两个XPages中的一个上,您正在将NotesDocument(不是DominoDocument数据源,而是NotesDocument对象)存储在范围变量中。Domino对象不可序列化,这就是引发错误的原因。最有可能的位置是您要从中移动的页面


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

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


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

    好的,谢谢您的评论。我已经知道不能将NotesDocument存储在作用域变量中。这就是为什么我要记录viewScope变量作为发现bug的第一步。但所有变量都是布尔或字符串。。。实际上,我不想保存或缓存文档。问题是,如何找到将文档放入作用域的代码片段。。。但是你给了我一个很好的提示:我只查看了我的目标页面(只读页面),也许我必须查看我的源页面(可编辑页面)。我稍后会在这里写我的结果……是否可能是某个UIControl或数据源具有解析为NotesDocument的计算属性?ie而不是范围变量。也许有一个线索是writeObjectEx在它的第6个递归中,所以想想在作用域/控制树中大约有6个深度的东西。您是否100%确定错误来自“显示”页面?如果您从编辑页面切换回来,编辑页面不是正在序列化的页面吗?所以。你们都是对的:错误来自目标页面。有一个由同事创建的自定义控件。他有一个NotesDocument作为(计算的)数据源。在我跳出窗外之前,他发现了错误并向我报告:-)谢谢你的帮助!!!!好的,谢谢你的评论。我已经知道不能将NotesDocument存储在作用域变量中。这就是为什么我要记录viewScope变量作为发现bug的第一步。但所有变量都是布尔或字符串。。。实际上,我不想保存或缓存文档。问题是,如何找到将文档放入作用域的代码片段。。。但是你给了我一个很好的提示:我只查看了我的目标页面(只读页面),也许我必须查看我的源页面(可编辑页面)。我稍后会在这里写我的结果……是否可能是某个UIControl或数据源具有解析为NotesDocument的计算属性?ie而不是范围变量。也许有一个线索是writeObjectEx在它的第6个递归中,所以想想在作用域/控制树中大约有6个深度的东西。您是否100%确定错误来自“显示”页面?如果您从编辑页面切换回来,编辑页面不是正在序列化的页面吗?所以。你们都是对的:错误来自目标页面。有一个由同事创建的自定义控件。他有一个NotesDocument作为(计算的)数据源。在我跳出窗外之前,他发现了错误并向我报告:-)谢谢你的帮助!!!!