在freemarker中使用递归宏时出现StackOverflow错误

问题描述 投票:0回答:1

我需要使用Freemarker中的实体列表迭代器迭代大量记录。但是,在使用递归宏时,只有达到1000条记录时才会出现StackOverflow错误。以下是相同的代码段。

<#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 ofbiz
1个回答
0
投票

无论FreeMarker如何,通过递归处理1000个元素并不是一种常规做法(除了在一些没有常规循环构造但具有尾递归优化的函数式语言中)。尝试使用#list。如果您无法从该查询API获取ListIterator(但如果可以,请查看它),作为最后的手段,您可以执行此操作(穷人的do { ... } while (cond)):

<#list 1..100000000 as _>
  ...
  <#if !tmp?has_content><#break></#if>
</#list>

(有足够高的incompatible_improvements FreeMarker配置设置你可以编写<#list 1.. as _>,但我不知道它设置在那里。所以我指定了一些任意高的数字,无论如何都会导致超时或内存不足。)

© www.soinside.com 2019 - 2024. All rights reserved.