1

Railo のバグとして提起されましたhttps://issues.jboss.org/browse/RAILO-2698 - この質問はクローズする必要があります

現在、次の cfscript を使用して、他のデータの中にいくつかの CFC のインスタンスを含むかなり複雑な Struct で ObjectSave() を試みています (これは、問題を再現するためにまとめたテスト スクリプトです)。

<cfscript>
    thisState = session.objBasket.getState();
    writedump(thisState); // dumps the object successfully
    ObjectSave(thisState); // causes java.io.UTFDataFormatException
</cfscript>

次のエラーが表示されますjava.io.UTFDataFormatException(スタック トレースが続きます)。これを修正する方法を知っている人はいますか、それとも単に仕事に間違ったツールを使用しようとしているだけですか?

エラーが発生するRailoのバージョン

  • Railo 4.1.1.009 最終版 (Java 1.7.0_45)
  • Railo 4.1.1.009 最終版 (Java 1.7.0_17)
  • Railo 4.1.2.001 最終版 (Java 1.7.0_45) (プレビュー リリース)

エラーが発生しない Railo バージョン

  • Railo 4.0.4.001 最終版 (Java 1.7.0_45)

エラーのスタック トレース

java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2163):2163 での java.io.UTFDataFormatException。java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2006):2006 で。 writeUTF(ObjectOutputStream.java:868):868 at railo.runtime.ComponentImpl.writeExternal(ComponentImpl.java:1975):1975 at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1458):1458 at 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 at 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 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347):347 at railo.commons.collection.AbstractMapPro.writeExternal(AbstractMapPro.java:49):49 at 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(不明なソース):-1 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43):43 at java.lang.reflect .Method.invoke(Method.java:606):java.io.ObjectStreamClass で 606.invokeWriteObject(ObjectStreamClass.java:988):java.io で 988。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 で railo.runtime.type. UDFImpl._call(UDFImpl.java:307): railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:198) で 307: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): railo.runtime.type.UDFImpl.implementation で -1(UDFImpl.java:94): railo.runtime.type で 94 .UDFImpl._call(UDFImpl.java:307):307 で railo.runtime.type.UDFImpl.callWithNamedValues(UDFImpl.java:198):198 で railo.runtime.ComponentImpl._call(ComponentImpl.java:617):617 railo.runtime.ComponentImpl._call(ComponentImpl.java:499):499 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 at 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 で railo.runtime.type.UDFImpl._call(UDFImpl.java:307): railo.runtime.type.UDFImpl.call(UDFImpl.java:211) で 307: railo.runtime.ComponentImpl._call(ComponentImpl.java:616) で 211: railo.runtime.ComponentImpl._call(ComponentImpl.java: 499):499 で railo.runtime.ComponentImpl.call(ComponentImpl.java:1715):1715 で 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 at application_cfc$cf.udfCall(/var/www/html/www/www.simon.test/Application .cfc): -1 で railo.runtime.type.UDFImpl.implementation(UDFImpl.java:94):94 で railo.runtime.type.UDFImpl._call(UDFImpl.java:307):307 で railo.runtime.type .UDFImpl.call(UDFImpl.java:211):211 で railo.runtime.ComponentImpl._call(ComponentImpl.java:616):616 で railo.runtime.ComponentImpl._call(ComponentImpl.java:499):499 で railo.runtime.ComponentImpl.call(ComponentImpl.java:1715):1715 で 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 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305): org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) で 305: org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) で 210: org.apache で 222 .catalina.core.StandardContextValve.invoke(StandardContextValve.java:123): org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) で 123: org.apache.catalina.core.StandardValve.invokeHost で 472 (StandardHostValve.java:171): org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) で 171: org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) で 99: 118 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407):407 at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200):200 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589):589 at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310):310 at java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1145):1145 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615):615 at 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;
    }
}
4

2 に答える 2

1

次の 2 つのメソッドは、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;
}
于 2013-10-30T17:23:40.110 に答える