Поднято как ошибка с 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;
}
}