ObjectSave вызывает исключение java.io.UTFDataFormatException

Поднято как ошибка с Railo https://issues.jboss.org/browse/RAILO-2698 - этот вопрос следует закрыть

В настоящее время я пытаюсь использовать 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 4.1.1.009 (Java 1.7.0_17)
  • Railo 4.1.2.001 final (Java 1.7.0_45) (предварительный выпуск)
  • Финал Railo 4.0.4.001 (Java 1.7.0_45)

Версии Railo, в которых ошибка не возникает

  • Посмотрите на трассировку стека. Он отвечает на все ваши вопросы.

Трассировка стека ошибки

Модульный тест + сопутствующий cfc, который можно использовать для воспроизведения

javaErrorTest.cfc (модульный тест)

TestObject.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);
        }
    }
}

Финал Railo 4.1.1.009 (Java 1.7.0_45)

component {
    public TestObject function init(
        required numeric levels = 0
    ) {
        variables.a = (arguments.levels > 0)?new TestObject( levels = arguments.levels - 1 ):{};
        return this;
    }
}

person Simon at My School Portal    schedule 28.10.2013    source источник
comment
Привет @PeterBoughton - в настоящее время работаю над этим, в настоящее время попытка надежно воспроизвести не представляется возможной без загрузки большого количества исходного кода. Простые примеры, кажется, просто не вызывают ошибку - начинают задаваться вопросом, есть ли циклическая ссылка, которая исправит для issues.jboss.org/browse/RAILO-2439 затронуто   -  person Peter Boughton    schedule 28.10.2013
comment
Я указал на это как на ошибку Railo issues.jboss.org/browse/RAILO-2698. - это, вероятно, следует закрыть, поскольку с моей стороны не требуется никакого обходного пути, на самом деле это должно быть исправлено в Railo   -  person Simon at My School Portal    schedule 28.10.2013
comment
Проблема, поднятая в этом вопросе, вместо этого является ошибкой в ​​​​Railo, и теперь я смог поднять ее как таковую. На этот вопрос не будет полезного ответа.   -  person Simon at My School Portal    schedule 30.10.2013
comment
Я видел об этом ограничении в 65 КБ, однако успешно сумел сохранить созданный модульным тестом объект размером более 100 МБ с помощью ObjectSave, поэтому размер не может быть проблемой здесь. Кажется, что-то об использовании ObjectSave в _1_ вызывает эту ошибку, хотя, как уже упоминалось, я все еще пытаюсь выделить точный триггер для нее + не могу объяснить, почему это происходит только в _2_. Тем не менее, спасибо за объяснение, я вернусь к исходному коду railo + посмотрю, не выскакивает ли что-нибудь из меня (хотя я не касался Java так сильно, как должен был!)   -  person Simon at My School Portal    schedule 30.10.2013


Ответы (2)


Взгляд на Javadoc показывает, что это исключение генерируется writeUTF(), если данные для записи длиннее 65535 байт.

java.io.UTFDataFormatException at java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2163):2163 at java.io.ObjectOutputStream$BlockDataOutputStream.writeUTF(ObjectOutputStream.java:2006):2006 

Это код, который вызывает writeUTF().. Похоже, это ошибка в классе railo.runtime.ComponentImpl. Он не должен вызывать writeUTF() для такой длинной строки.

railo.runtime.ComponentImpl.writeExternal(ComponentImpl.java:1975):1975

Следующие 2 метода — это то, что я использую вместо ObjectSave и ObjectLoad, пока ошибка Railo не будет исправлена. Кажется, он работает до приличного уровня сложности.

person user207421    schedule 30.10.2013
comment
Соответствующий класс «railo» имеет метод catch(){}, который вызывает catch для строк. Он должен вызвать _3_ - person Simon at My School Portal; 30.10.2013
comment
Я вижу строки, которые вы имеете в виду, спасибо за эту дополнительную информацию - надеюсь, это позволит им быстро исправить это, как только я смогу предоставить шаги воспроизведения! - person user207421; 30.10.2013
comment
java.io.UTFDataFormatException в 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 в sun.reflect.GeneratedMethodAccessor62.invoke(Неизвестный источник):-1 в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43):43 в java.lang.reflect .Method.invoke(Method.java:606):606 в 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(ObjectOutp utStream.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 в sun.reflect.GeneratedMethodAccessor62.invoke(Неизвестный источник):-1 в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43):43 в java.lang.reflect.Method. вызывать(Method.java:606):606 на 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 в railo.runtime.type.UDFImpl._call(UDFImpl.java: 307):307 в 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 в railo.runtime.type.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 в 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 в 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.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 в 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 в javax.servlet.http.HttpServlet.service(HttpServlet.java:728):728 в 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.AjpPr ocessor.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 - person Simon at My School Portal; 30.10.2013

Если у вас есть воспроизводимый тестовый пример, которого нет в предыдущих версиях, задайте его на странице . Issues.jboss.org/browse/RAILO

// 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;
}
person Simon at My School Portal    schedule 30.10.2013