【问题标题】:Using Groovy TemplateEngines with large (>64k) template将 Groovy TemplateEngines 与大型 (>64k) 模板一起使用
【发布时间】:2013-10-29 06:10:20
【问题描述】:

如何使用 SimpleTemplateEngineGStringTemplateEngine 处理大于 65535 个字符的模板?

我收到以下错误:

groovy.lang.GroovyRuntimeException: 无法解析模板脚本(您的模板可能包含错误或尝试使用当前不支持的表达式):启动失败: SimpleTemplateScript1.groovy:5614:字符串太长。给定的字符串长度为 198495 个 Unicode 代码单元,但最多允许 65535 个。

我正在使用以下代码构建模板:

def templateEngine = new SimpleTemplateEngine()
def binding = [:]
templateEngine
    .createTemplate(new FileReader("input.txt))
    .make(binding)
    .writeTo(new FileWriter(new File("output.txt")))

我发现 JIRA 3487 与此问题相关:GStringTemplateEngine fails to work with >64K strings

我曾考虑过对输入进行分块,但这会带来其自身的复杂性,例如确保不会在表达式中间中断。

如果有任何其他建议,我将不胜感激。

【问题讨论】:

    标签: groovy


    【解决方案1】:

    找到了GStringTemplateEngine的一些替代品,它们可以处理大字符串。

    https://github.com/mbjarland/groovy-streaming-template-engine

    https://github.com/mbknor/gt-engine

    【讨论】:

    • 不确定我在寻找解决方案时是如何错过该项目的。显然我的 Google-Fu 需要改进。
    • groovy-streaming-template-engine 对我不起作用。它失败了(java.lang.RuntimeException:方法代码太大!)对于我来说。 250KB 模板,与 groovy 内置模板引擎一模一样。
    【解决方案2】:

    尝试改用GStringTemplateEngine。来自 javadoc:

    处理替换变量和表达式的模板源文件 放入模板源文本中的占位符以生成所需的 使用流式方法输出。该发动机具有等效 SimpleTemplateEngine 的功能,但创建模板 使用可写闭包使其可能更适合大型 模板或流式场景。

    您可能会简单地将new SimpleTemplateEngine() 替换为new GStringTemplateEngine(),但当然应该对其进行测试。

    【讨论】:

    • 这真是一个惊喜。经过一些测试,如果模板中有一大块文本(> 64K)不包含任何变量,它似乎会失败。当变量遍布各处时,至少它适用于约 100K 文件。但是,如果文本非常大(我在一个包含很多变量的 550K 文件中得到了这个),则与此类的实现相关的另一个限制开始出现(方法太长)。很遗憾,真的。这应该不难解决,但似乎没有人对修复它很感兴趣。
    • 这里有同样的问题。太糟糕了,这无法修复。真无赖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多