代码之家  ›  专栏  ›  技术社区  ›  Sonal Patwari

在freemarker中使用递归宏时发生StackOverflow错误

  •  0
  • Sonal Patwari  · 技术社区  · 7 年前

    我需要在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()}
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   ddekany    6 年前

    不管FreeMarker如何,使用递归处理1000个元素都不是一种正常的做法(除了在一些没有常见循环构造但具有尾部递归优化的函数式语言中)。尝试使用 #list 。如果你找不到 List Iterator 从该查询API(但如果可以的话,请查看),作为最后的手段,您可以执行此黑客操作(穷人的 do { ... } while (cond) ):

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

    (足够高 incompatible_improvements 可以写入的FreeMarker配置设置 <#list 1.. as _> ,但我不知道它设置了什么。因此,我指定了一些任意高的数字,在实践中无论如何都会导致超时或内存不足。)

    推荐文章