在 freemarker 中使用递归宏时发生 StackOverflow 错误
StackOverflow error while using recursive macro in freemarker
我需要在 Freemarker 中使用实体列表迭代器迭代大量记录。但是,在使用递归宏时,当它仅达到 1000 条记录时会出现 Whosebug 错误。下面是相同的代码片段。
<#macro recurseTest value>
${value.partyId!}
${value.firstName!}
${value.lastName!}
<#local tmp = eli.next()!/>
<#if tmp?has_content>
<@recurseTest tmp/>
</#if>
</#macro>
<#assign eli = EntityQuery.use(delegator).from("Person").queryIterator()/>
<br>
<@recurseTest eli.next()!/>
${eli.close()}
不管 FreeMarker,用递归处理 1000 个元素都不是正常的做法(除了一些函数式语言,它们没有通常的循环结构,但有尾递归优化)。尝试使用 #list
。如果您无法从该查询 API 中获得 List
或 Iterator
(但如果可以的话,请调查一下),作为最后的手段,您可以执行此 hack(可怜的 do { ... } while (cond)
):
<#list 1..100000000 as _>
...
<#if !tmp?has_content><#break></#if>
</#list>
(如果 incompatible_improvements
FreeMarker 配置设置足够高,您可以编写 <#list 1.. as _>
,但我不知道它在那里设置了什么。所以我指定了一些任意高的数字,这会导致无论如何在实践中超时或 out-of-memory。)
我需要在 Freemarker 中使用实体列表迭代器迭代大量记录。但是,在使用递归宏时,当它仅达到 1000 条记录时会出现 Whosebug 错误。下面是相同的代码片段。
<#macro recurseTest value>
${value.partyId!}
${value.firstName!}
${value.lastName!}
<#local tmp = eli.next()!/>
<#if tmp?has_content>
<@recurseTest tmp/>
</#if>
</#macro>
<#assign eli = EntityQuery.use(delegator).from("Person").queryIterator()/>
<br>
<@recurseTest eli.next()!/>
${eli.close()}
不管 FreeMarker,用递归处理 1000 个元素都不是正常的做法(除了一些函数式语言,它们没有通常的循环结构,但有尾递归优化)。尝试使用 #list
。如果您无法从该查询 API 中获得 List
或 Iterator
(但如果可以的话,请调查一下),作为最后的手段,您可以执行此 hack(可怜的 do { ... } while (cond)
):
<#list 1..100000000 as _>
...
<#if !tmp?has_content><#break></#if>
</#list>
(如果 incompatible_improvements
FreeMarker 配置设置足够高,您可以编写 <#list 1.. as _>
,但我不知道它在那里设置了什么。所以我指定了一些任意高的数字,这会导致无论如何在实践中超时或 out-of-memory。)