无法序列化JavaScript函数

时间:2015-10-16 10:41:45

标签: java xpages ssjs

我试图更改XPage应用程序中的页面持久性,打算从"将页面保留在内存中" to"仅将当前页面保留在内存中#34;。当然,我遇到运行时错误,告诉我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)

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你的问题的答案不是那么多功能不能被序列化,它的功能可以被序列化。或者,如果你想获得非常技术性的,可以预期任何人都不会以任何方式坚持。 SSJS并不意味着序列化。在这篇博文中:http://xomino.com/2014/03/26/why-learning-javascript-is-more-critical-to-xpage-developers-than-java/在评论中有一个很好的讨论关于序列化有毒的原因和地点,特别是SSJS(你可以忽略围绕java与JavaScript博客文章的实际讨论 - 只是集中精力关于序列化的比特)。

答案 2 :(得分:0)

我的最近发现也恕我直言,也回答了这个问题,请参见XPages: how to put a Java Date value in an ObjectObject。几年前,我开始将代码从SSJS移到Java,然后在ObjectObject和ArrayObject类上遇到了(更好的是很多)麻烦,主要是因为必须使用称为FBSUtility。

我的主要问题是我无法在对象对象中存储日期。在稍后的阶段中,我很高兴找到一个带有JSContext参数FBSUtility.wrap(jsContext, someDate)的调用,该参数允许存储Date值。毫无头绪地告诉我有关JSContext在这里实际上是做什么的(我是),但是我认为那是结局。

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

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

因此,我了解到的是:如果将“持久性模式”设置为Keep pages on DiskKeep only the current page in memory,请尝试避免ObjectObject对象,并且从不永远不要将FBSUtility与JSContext结合使用。 / p>