0

我正在尝试更改 XPages 应用程序中的页面持久性,打算从“将页面保留在内存中”移动到“仅保留当前页面在内存中”。当然,我会收到运行时错误,告诉我 XPages 无法序列化 JavaScript 函数。但是哪个功能?堆栈跟踪只显示标准的 Java 错误内容,但没有关于哪些变量或函数不能序列化?

我之前也遇到过类似的问题,总是要花很多时间去深挖代码解决问题。这需要很长时间......我现在真的已经拥有它了。

有没有聪明的方法来找出哪个函数不能被序列化?

更新

OpenLog Logger 提供了什么:

Client Version
Release 9.0.1FP3
January  12, 2015
Database    aalto803.nsf
Agent   /aASK.xsp
Method  class java.lang.StackTraceElement.writeValue
Error Num   -
Error Line  364
Error Msg   Impossible de sérialiser une fonction JavaScript
Language    Java

Stack Trace
java.io.IOException: Impossible de sérialiser une fonction JavaScript
at com.ibm.jscript.types.FBSValue.writeValue(FBSValue.java:364)
at com.ibm.jscript.types.FBSDefaultObject.writeExternal(FBSDefaultObject.java:746)
at com.ibm.jscript.std.ObjectObject.writeExternal(ObjectObject.java:106)
at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1462)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
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.GeneratedMethodAccessor51.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:1020)
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)
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)
4

3 回答 3

0

XPages OpenLog Logger 不仅可以捕获未捕获的异常(听起来像是其中之一),还可以捕获哪个组件触发了问题。它需要应用程序中的错误 XPage(否则在发生错误后没有运行渲染响应阶段,XPages OpenLog Logger 从中检索详细信息)。这可能会帮助您追踪它。

否则,请检查您在 viewScope 等中存储的功能。这可能会帮助您缩小范围。SSJS 并不是真正为面向对象编程而设计的,我认为这是在范围内存储函数时出现问题的地方。

于 2015-10-16T10:53:31.797 回答
0

您的问题的答案与其说是哪个函数不能被序列化,不如说是您的任何函数都不能被序列化。或者,如果您想获得非常技术性的知识,则不能指望以任何方式可靠地坚持下去。SSJS 并不意味着要序列化。在此博客文章中:http: //xomino.com/2014/03/26/why-learning-javascript-is-more-critical-to-xpage-developers-than-java/评论中有很好的讨论关于为什么以及在哪里序列化是有毒的,特别是对于 SSJS(你可以忽略围绕 java vs JavaScript 的博客文章的实际讨论——只关注与序列化有关的部分)。

于 2015-10-16T20:51:53.327 回答
0

我最近的一个发现也回答了这个问题,恕我直言,请参阅XPages: how to put a Java Date value in an ObjectObject。几年前,我开始将我的代码从 SSJS 迁移到 Java,我在 ObjectObject 和 ArrayObject 类上遇到了一些(更好:很多)麻烦,主要是使用一个名为FBSU实用程序。

我的主要问题是我无法将 Date 存储在 ObjectObject 对象中。在稍后阶段,我很高兴找到了一个带有 JSContext 参数的调用FBSUtility.wrap(jsContext, someDate),它允许存储一个 Date 值。叫我一无所知,关于 JSContext 在这里实际上做了什么(我就是),但我认为这就是它的结束。

最近,为了测试我们的应用程序,我将 Persistence Mode 从内存中的几页更改为磁盘上的所有内容,从而强制对所有对象进行序列化。我发现我的应用程序的某个特定元素不再起作用,总是在出现序列化错误时停止。进一步的测试证明,当我从 OO 对象中删除所有 Date 值时没有错误。

早些时候,我已经为应用程序的其他部分采用了 JsonJavaObject 和 JsonJavaArray 类(是的,我知道,混乱的编码、大型应用程序、从来没有时间做正确的事情、50 Mb 模板数据库等)。我重写了代码以删除所有对 JSContext、FBSUtility、ObjectObject 和 ArrayObject 类的使用,将它们替换为 JsonJava 类,并且不再有 JS 函数无法序列化的可怕消息。

所以,我学到的是:如果您的 Persistence Mode 设置为Keep pages on Diskor Keep only the current page in memory,请尽量避免使用 ObjectObject 对象,并且永远不要将 FBSUtility 与 JSContext 结合使用。

于 2020-03-29T16:53:58.563 回答