Есть ли способ глобально применить атрибут top к cfdump / writeDump при работе с объектами ORM?

При работе с вложенными отношениями ORM с использованием cfdump или writeDump может быстро привести к java.lang.OutOfMemoryError ошибкам, потому что CF пытается разрешить отношения во вложенных объектах и ​​выгрузить слишком много объектов.

Этого можно избежать с помощью атрибута top, например: <cfdump var=#SomeObject# top=3 />

Больно не забывать писать это все время - есть ли способ настроить CF, чтобы не опускаться слишком много уровней при работе с объектами ORM?


person Peter Boughton    schedule 05.08.2013    source источник


Ответы (1)


Похоже, что для этого нет никаких настроек администратора. (возникла проблема)

Неидеальное решение - создать оболочку для тега cfdump, переименовав {cfusion}/wwwroot/WEB-INF/cftags/dump.cfm в (например) origdump.cfm, а затем создав новый dump.cfm файл, содержащий:

<cfif isObject(attributes.var) AND NOT StructKeyExists(attributes,'top')>
    <cfset attributes.top = 3 />
</cfif>

<cforigdump attributecollection=#attributes# />

<cfexit method="exitTag" />

К счастью, функция writeDump вызовет эту оболочку (так что она работает как для тега, так и для функции).

К сожалению, оболочка не вызывается рекурсивно - если объект ORM находится в структуре или массиве, тогда исходная проблема все еще проявляется - возможно, можно предварительно просканировать сложные переменные, чтобы определить, есть ли внутри отношения и установить соответствующее верхнее значение, но с этим может быть достигнуто только ограниченное решение (т.е. оно повлияет на соседние структуры / массивы).

person Peter Boughton    schedule 05.08.2013
comment
Это было решение, которое я собирался порекомендовать. Я не совсем вижу проблему рекурсии, когда проверяю это в своей голове (что, как я полагаю, само по себе не является проверкой на столе). Рекурсивные вызовы dump.cfm изнутри origdump.cfm будут передавать атрибут top вызову dump.cfm, не так ли? Итак, ради аргумента ваш первоначальный вызов dump.cfm не имеет параметра TOP, но он вызывает origdump.cfm с top=3. origdump.cfm затем внутренне вызывает dump.cfm, передавая top=3, что ваша dump.cfm оболочка уважает, без проблем. Или мне нужно достать ручку и бумагу и как следует проверить? - person Adam Cameron; 05.08.2013
comment
Извините, не уверен, что я слишком хорошо это объяснил. Обертка вызывается только для верхнего уровня - т.е. если вы выполняете <cfdump var=#[obj1,obj2]# />, то верхнее условие не выполняется (var - это массив, а не объект), и проверка не выполняется для дочерних элементов массива. Таким образом, необходимо обновить верхнюю проверку для поиска контейнеров (массивов / структур), а затем проверить их дочерние узлы и установить их соответствующим образом, за исключением того, что это не сработает для таких ситуаций, как {one:object,two:[[[[a,b,c]]]]}, потому что полное содержимое двух не будет отображаться. Есть смысл? - person Peter Boughton; 05.08.2013
comment
(Конечно, это проблема только в том случае, если на глубине объекта + 3 есть значения, не являющиеся объектами - не уверен, насколько распространено такое событие в целом.) - person Peter Boughton; 05.08.2013