Модель-клей и Railo Application.cfc
Я пытаюсь запустить тестовое приложение MG на Railo и попал в ловушку. Когда я захожу в приложение MG, я получаю:
Railo 3.1.0.012 Error (Java.lang.classformaterror)
Message Invalid index 16 in LocalVariableTable in class file
application_cfc$cf
Java Stacktrace
Invalid index 16 in LocalVariableTable in class file application_cfc
$cf
at java.lang.ClassLoader.defineClass1(Native Method):-2
at java.lang.ClassLoader.defineClass(ClassLoader.java:621):621
at java.lang.ClassLoader.defineClass(ClassLoader.java:401):401
at railo.commons.lang.PhysicalClassLoader.loadClass
(PhysicalClassLoader.java:116):116
at railo.runtime.PageSourceImpl.compile(PageSourceImpl.java:225):225
at railo.runtime.PageSourceImpl.loadPhysical(PageSourceImpl.java:167):
167
at railo.runtime.PageSourceImpl.loadPage(PageSourceImpl.java:102):102
Я провел небольшое тестирование и обнаружил, что когда в Application.cfc происходит следующее:
<cfloop from="1" to="#arrayLen(mgInstances)#" index="i">
<cfset mgInstances[i].executeEvent(arguments.eventName, values) />
</cfloop>
Я получаю ошибку. Если я удаляю эту часть, я начинаю получать:
Message Application context not loaded!
Error Code
org.coldspringframework.webApplicationContextProxy.cantLoadApplicationContext
Итак, я предполагаю, что в Application.cfc строка:
<cfset var mgInstances = createObject
("component","ModelGlue.Util.ModelGlueFrameworkLocator").findInScope
(appScope) />
Терпит неудачу.
У кого-нибудь еще есть проблемы с этим? Какие-либо решения? Спасибо!!!
3 ответа
В финале Railo 3.1 (или одном из следующих патчей) у нас будет вкладка совместимости в администраторе Railo, которая позволяет вам установить значение passby в качестве поведения по умолчанию в Railo. Затем вы можете включить эту настройку и, следовательно, заставить Transfer и ModelGlue III работать нормально. Здесь просто замечание, что атрибут passby не нарушает существующий код CF. Это просто обрабатывается как метаданные CFARGUMENT.
Мы искренне считаем это ошибкой в Coldfusion, но из-за требований совместимости мы адаптируем это поведение и сделаем его необязательным в Railo Administrator.
Герт Франц Райло с открытым исходным кодом
Следует учитывать одну важную вещь: в истории языка CFML всегда было стандартное поведение для передачи массивов по значению, а не по ссылке. Это было чем-то, что существовало с самых первых дней существования языка, вопреки поведению многих других языков программирования, но с каких пор у CF возникли проблемы с нарушением соглашения? (например, массивы начинают свою нумерацию с 1 вместо 0).
Railo, с другой стороны, передает массивы по ссылке, а не по значению, как его поведение по умолчанию. Вы можете увидеть, как это может вызвать проблемы с другими платформами. Чтобы устранить эту проблему совместимости, Railo позволяет вам использовать атрибут passby тега cfargument для обозначения любого параметра как значения или ссылки. Вот так:
<cfargument name="myArray" type="array" required="true" passby="value" />
Конечно, это означает, что некоторые фреймворки придется переписать для Railo, так как это нарушает полную совместимость с Adobe ColdFusion.
Передача ORM на Railo сейчас полностью нарушена, как и результат этой конкретной проблемы, а также других сбоев в поведении между Railo и CF8. Не исключено, что Model Glue и другие существующие CF-фреймворки будут страдать от подобных глюков.
Я записал бы это как ошибку в трекере ошибок Railo. Как правило, они довольно хорошо решают эти ошибки, так что популярные платформы Coldfusion работают на их платформе.