XPAges: "java.io.NotSerializableException: lotus.domino.local.Document"
У меня есть XPage, который содержит один документ Notes. Цель этой страницы - просто показать некоторые соответствующие поля документа.
Доступ к странице в первый раз в порядке. А также при последующем показе без изменения нижележащего документа все в порядке.
Но когда я перехожу с этого на другой XPage и меняю там документ (да, у меня есть другая страница, предназначенная для редактирования документа), а затем возвращаюсь на страницу "шоу", я получаю java.io.NotSerializableException
в фазе ответа рендеринга.
Странно: это для lotus.domino.local.Document
... я никогда не хочу сохранять / сериализовать документ...:-o
Что я сделал, чтобы найти ошибку в моем коде:
- Я зарегистрировал содержимое viewScope в beforeRenderResponse Event страницы, но есть только простые объекты (строки и логические значения).
- Я установил viewState страницы на "
nostate
". - Я установил атрибут readonly на странице "
true
". - Я удалил все привязки данных "при загрузке страницы" (переключил '
${...}
к#{...}
")
Так что еще я могу сделать, чтобы найти точку кода, где какой-то документ нужно сохранить? Каковы типичные причины ошибок в этом случае?
Спасибо за любую помощь, чтобы помочь себе!:-)
Мой Stacktrace:
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>
1 ответ
На одном из этих двух XPages вы храните NotesDocument (не источник данных DominoDocument, а объект NotesDocument) в переменной области видимости. Объекты Domino не сериализуемы, что вызывает ошибку. Наиболее вероятным местом является страница, с которой вы перемещаетесь.
Если вам нужен доступ к определенному документу, сохраните UNID документа в переменной области и используйте database.getDocumentByUNID()
чтобы получить это. Это почти наверняка то, что делает источник данных DominoDocument.