无法序列化JavaScript函数

问题描述 投票:0回答:3

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

之前我也遇到过类似的问题,并且花很多时间来深入研究代码并解决问题。这需要很长时间...我现在真的已经拥有了。

有一种聪明的方法可以找出哪个函数不能序列化吗?

UPDATE

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)
java xpages ssjs
3个回答
0
投票

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

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


0
投票

您的问题的答案不是说很多WHICH函数不能序列化,它的所有功能都不能序列化。或者,如果您想获得非常专业的技术,则不能期望它们以任何方式可靠地持久存在。 SSJS并非要序列化。在此博客文章中,这里http://xomino.com/2014/03/26/why-learning-javascript-is-more-critical-to-xpage-developers-than-java/的注释中有一个很好的讨论,即为什么以及在何处有序列化是有毒的,特别是使用SSJS(您可能会忽略围绕Java与JavaScript的博客文章的实际讨论-只关注于有关序列化的位)。


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对象,并且never与FBContext结合使用FBSUtility。

© www.soinside.com 2019 - 2024. All rights reserved.