在处理嵌套的 ORM 关系时,使用cfdump或writeDump会迅速导致java.lang.OutOfMemoryError
错误,因为 CF 试图解析嵌套对象中的关系并转储太多对象。
这可以通过top
属性来避免,例如:<cfdump var=#SomeObject# top=3 />
记住一直写这个很痛苦 - 有没有办法配置 CF 在处理 ORM 对象时不会下降太多级别?
似乎没有任何管理员设置。(提出的问题)
一个不完美的解决方案是通过重命名{cfusion}/wwwroot/WEB-INF/cftags/dump.cfm
为(例如)origdump.cfm
然后创建一个dump.cfm
包含以下内容的新文件来为 cfdump 标签创建一个包装器:
<cfif isObject(attributes.var) AND NOT StructKeyExists(attributes,'top')>
<cfset attributes.top = 3 />
</cfif>
<cforigdump attributecollection=#attributes# />
<cfexit method="exitTag" />
幸运的是,writeDump 函数将调用这个包装器(因此它适用于标签和函数)。
不幸的是,包装器没有被递归调用——如果 ORM 对象在结构或数组中,那么原始问题仍然会表现出来——可以预扫描复杂变量以确定内部是否存在关系并设置适当的最高值,但是这样只能实现有限的解决方案(即它会影响相邻的结构/数组)。