引起Railo https://issues.jboss.org/browse/RAILO-2698的错误 - 应该关闭此问题
我正在尝试在一个相当复杂的Struct上使用ObjectSave(),它包含一些CFC的实例以及其他数据,使用以下cfscript(这是我放在一起重现问题的测试脚本)
<cfscript>
thisState = session.objBasket.getState();
writedump(thisState); // dumps the object successfully
ObjectSave(thisState); // causes java.io.UTFDataFormatException
</cfscript>
我收到以下错误java.io.UTFDataFormatException
(跟踪堆栈跟踪)。有没有人知道解决这个问题的方法,还是仅仅是尝试使用错误的工具来解决这个问题?
Railo版本错误发生在
上Railo版本
上未发生错误错误的堆栈跟踪
java.io.UTFDataFormatException at java.io.ObjectOutputStream中的$ BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2163):2163 在 java.io.ObjectOutputStream中的$ BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2006):2006年 在 java.io.ObjectOutputStream.writeUTF(ObjectOutputStream.java:868):868 在 railo.runtime.ComponentImpl.writeExternal(ComponentImpl.java:1975):1975 在 java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1458):1458 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429):1429 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177):1177 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347):347 在java.util.HashMap.writeObject(HashMap.java:1133):1133 at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source): - 1 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43):43 在java.lang.reflect.Method.invoke(Method.java:606):606 at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988):988 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495):1495 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431):1431 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177):1177 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347):347 在 railo.commons.collection.AbstractMapPro.writeExternal(AbstractMapPro.java:49):49 在 java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1458):1458 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429):1429 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177):1177 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547):1547 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508):1508 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431):1431 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177):1177 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347):347 在java.util.HashMap.writeObject(HashMap.java:1133):1133 at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source): - 1 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43):43 在java.lang.reflect.Method.invoke(Method.java:606):606 at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988):988 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495):1495 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431):1431 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177):1177 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347):347 在 railo.commons.collection.AbstractMapPro.writeExternal(AbstractMapPro.java:49):49 在 java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1458):1458 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429):1429 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177):1177 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547):1547 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508):1508 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431):1431 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177):1177 在 java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347):347 在 railo.runtime.converter.JavaConverter.serialize(JavaConverter.java:67):67 在 railo.runtime.functions.other.ObjectSave.call(ObjectSave.java:31):31 在 railo.runtime.functions.other.ObjectSave.call(ObjectSave.java:22):22 在 mso.clientobject_cfc $ cf._3(/var/www/html/www/www.simon.test/mso/ClientObject.cfc:476):476 在 mso.clientobject_cfc $ cf.udfCall(/var/www/html/www/www.simon.test/mso/ClientObject.cfc): - 1 在railo.runtime.type.UDFImpl.implementation(UDFImpl.java:94):94 at railo.runtime.type.UDFImpl._call(UDFImpl.java:307):307 at at railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:198):198 在 railo.runtime.type.scope.UndefinedImpl.callWithNamedValues(UndefinedImpl.java:709):709 在 railo.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:738):738 在 railo.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1513):1513 在 mso.clientobject_cfc $ cf._3(/var/www/html/www/www.simon.test/mso/ClientObject.cfc:437):437 在 mso.clientobject_cfc $ cf.udfCall(/var/www/html/www/www.simon.test/mso/ClientObject.cfc): - 1 在railo.runtime.type.UDFImpl.implementation(UDFImpl.java:94):94 at railo.runtime.type.UDFImpl._call(UDFImpl.java:307):307 at at railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:198):198 at railo.runtime.ComponentImpl._call(ComponentImpl.java:617):617 at at railo.runtime.ComponentImpl._call(ComponentImpl.java:499):499 at at railo.runtime.ComponentImpl.callWithNamedValues(ComponentImpl.java:1732):1732 在 railo.runtime.util.VariableUtilImpl.callFunctionWithNamedValues(VariableUtilImpl.java:738):738 在 railo.runtime.PageContextImpl.getFunctionWithNamedValues(PageContextImpl.java:1513):1513 在 mso.proxyclientobject_cfm $ cf._1(/var/www/html/www/www.simon.test/mso/proxyClientObject.cfm:19):19 在 mso.proxyclientobject_cfm $ cf.udfCall(/var/www/html/www/www.simon.test/mso/proxyClientObject.cfm): - 1 在railo.runtime.type.UDFImpl.implementation(UDFImpl.java:94):94 at railo.runtime.type.UDFImpl._call(UDFImpl.java:307):307 at at railo.runtime.type.UDFImpl.call(UDFImpl.java:211):211 at railo.runtime.ComponentImpl._call(ComponentImpl.java:616):616 at at railo.runtime.ComponentImpl._call(ComponentImpl.java:499):499 at at railo.runtime.ComponentImpl.call(ComponentImpl.java:1715):1715 at railo.runtime.util.VariableUtilImpl.callFunctionWithoutNamedValues(VariableUtilImpl.java:712):712 在 railo.runtime.PageContextImpl.getFunction(PageContextImpl.java:1503):1503 在 preparecosting_cfm $ cf.call(/var/www/html/www/www.simon.test/prepareCosting.cfm:24):24 在 railo.runtime.PageContextImpl.doInclude(PageContextImpl.java:834):834 在 railo.runtime.PageContextImpl.doInclude(PageContextImpl.java:781):781 在 application_cfc $ cf._1(/var/www/html/www/www.simon.test/Application.cfc:177):177 在 application_cfc $ cf.udfCall(/var/www/html/www/www.simon.test/Application.cfc): - 1 在railo.runtime.type.UDFImpl.implementation(UDFImpl.java:94):94 at railo.runtime.type.UDFImpl._call(UDFImpl.java:307):307 at at railo.runtime.type.UDFImpl.call(UDFImpl.java:211):211 at railo.runtime.ComponentImpl._call(ComponentImpl.java:616):616 at at railo.runtime.ComponentImpl._call(ComponentImpl.java:499):499 at at railo.runtime.ComponentImpl.call(ComponentImpl.java:1715):1715 at railo.runtime.listener.ModernAppListener.call(ModernAppListener.java:388):388 在 railo.runtime.listener.ModernAppListener._onRequest(ModernAppListener.java:204):204 在 railo.runtime.listener.MixedAppListener.onRequest(MixedAppListener.java:18):18 在 railo.runtime.PageContextImpl.execute(PageContextImpl.java:2167):2167 在 railo.runtime.PageContextImpl.execute(PageContextImpl.java:2134):2134 在 railo.runtime.engine.CFMLEngineImpl.serviceCFML(CFMLEngineImpl.java:335):335 在railo.loader.servlet.CFMLServlet.service(CFMLServlet.java:29):29 at javax.servlet.http.HttpServlet.service(HttpServlet.java:728):728 at at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305):305 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210):210 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222):222 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123):123 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472):472 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171):171 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99):99 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118):118 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407):407 在 org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200):200 在 org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:589):589 在 org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:310):310 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145):1145 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615):615 在java.lang.Thread.run(Thread.java:744):744
单元测试+随附cfc,可用于复制
javaErrorTest.cfc (单元测试)
component extends='mxunit.framework.TestCase' {
public void function trySavingLargeNestedStruct() {
// Prove that it doesn't happen with nested structures
var nestedStruct = {};
var nestInMe = nestedStruct;
// Make a big struct
var nestedStruct = {};
var v = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
for (var i in v) {
for (var j in v) {
for (var k in v) {
for (var l in v) {
nestedStruct[i][j][k][l] = {};
}
}
}
}
debug('Nested struct len = '&len(serialize(nestedStruct)));
ObjectSave(nestedStruct);
debug('Nested struct saved without error');
}
public void function triggerUTFDataFormatException() {
// Prove that it happens with objects nested deeply
var previousLength = 0;
for (var i=600;i<700;i++) {
objTest = new TestObject( levels = i );
var strSerialized = serialize(objTest);
try {
ObjectSave(objTest);
} catch (java.io.UTFDataFormatException e) {
// Expected place of java.io.UTFDataFormatException
debug('Levels = '&i-1&' has serialize() length = '&previousLength);
debug('Levels = '&i&' has serialize() length = '&Len(strSerialized));
debug(strSerialized);
debug(e);
fail('java.io.UTFDataFormatException (expected) error thrown');
} catch (any e) {
debug(e);
fail('Error thrown, not not the expected one');
}
previousLength = Len(strSerialized);
}
}
}
TestObject.cfc (在失败的测试中使用)
component {
public TestObject function init(
required numeric levels = 0
) {
variables.a = (arguments.levels > 0)?new TestObject( levels = arguments.levels - 1 ):{};
return this;
}
}
答案 0 :(得分:3)
查看堆栈跟踪。它回答了你的所有问题。
java.io.UTFDataFormatException at java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2163):2163 at java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2006):2006
对Javadoc的一瞥表明,如果要写入的数据超过65535字节,writeUTF()
将抛出此异常。
railo.runtime.ComponentImpl.writeExternal(ComponentImpl.java:1975):1975
这是调用writeUTF().
的代码所以它似乎是railo.runtime.ComponentImpl
类中的错误。它不应该为这么长的字符串调用writeUTF()
。
答案 1 :(得分:1)
在更正Railo错误之前,我使用以下两种方法代替ObjectSave和ObjectLoad。它似乎起到了相当复杂的作用。
// Replaces ObjectSave
private binary function serializeState(
required struct inState
) {
var strSerialized = serialize(arguments.inState);
return strSerialized.GetBytes();
}
// Replaces ObjectLoad
private struct function deserializeState(
required binary inState
) {
var strSerialized = ToString(arguments.inState);
var stcDeserialized = evaluate(strSerialized);
return stcDeserialized;
}