【问题标题】:Groovy Nested Templates - Cannot invoke methods in class from within templateGroovy 嵌套模板 - 无法从模板内调用类中的方法
【发布时间】:2012-05-30 13:58:13
【问题描述】:

我正在尝试使用 Groovy 的 SimpleTemplateEngine 来生成一些输出而不是 StringBuilders,但我无法让模板成功调用我的类中的其他方法(最终调用其他模板以形成嵌套链)。

当模板(下面的示例)调用方法 <% generateItemOutput(itemDescriptor.itemList) %> 时,我得到一个异常:

groovy.lang.MissingMethodException: No signature of method:
SimpleTemplateScript1.generateItemOutput() is applicable for
argument types: (java.util.ArrayList)

我已尝试将所有方法设为静态,并将导入添加到模板中的静态方法(如 suggested here),但我使用的导入得到了 unable to resolve class ...

SimpleTemplateScript1.groovy: 1: unable to resolve class uk.co.e2x.convert.XMLToSlurp.generateItemOutput
 @ line 1, column 20.
   out.print(""""""); import uk.co.e2x.convert.XMLToSlurp.generateItemOutput ;
                      ^

这是我在没有statics 的情况下所做的示例:

public String generateItemDescriptorOutput(itemDescriptor) {
    def params = [itemDescriptor: itemDescriptor]
    def template = new groovy.text.SimpleTemplateEngine().createTemplate(itemDescriptorTemplate())
    def writeable = template.make(params)
    return writeable.toString()
}

public String generateItemOutput(itemList) {
    ...
}

public String itemDescriptorTemplate() {
    return = '''\
${itemDescriptor.name} {
repository = "${itemDescriptor.repository}"
props = [
    <% generateItemOutput(itemDescriptor.itemList) %>
]
}
'''
}

我使用java -cp ... 调用它,但通过 groovy 调用时遇到了同样的问题。我转而通过 java 调用它的原因是我无法在 groovy 脚本中计算出静态方法的包路径。

有没有人有任何从模板中调用您自己的脚本/类方法的具体示例,或者可以告诉我我做错了什么?

干杯。

【问题讨论】:

    标签: templates groovy


    【解决方案1】:

    好的,我设法让它工作,最后它相当简单。我必须对所有生成和模板方法使用静态,然后将完全限定的包名称添加到模板内的方法中,而不是尝试进行导入。

    还发现我在命令中也缺少打印。这是固定模板:

    public static String itemDescriptorTemplate() {
        return = '''\
    ${itemDescriptor.name} {
    repository = "${itemDescriptor.repository}"
    props = [
        <% print uk.co.e2x.convert.XMLToSlurp.generateItemOutput(itemDescriptor.itemList) %>
    ]
    }
    '''
    

    【讨论】:

      【解决方案2】:

      我使用这样的静态实用方法在父模板中包含嵌套模板:

      class TemplateUtils {
      
          static String generateOutput(String templateFilename, Map templateBinding) {
              URL templateResource = TemplateUtils.classLoader.getResource(templateFilename)
              assert templateResource : "Resource for '${templateFilename}' not found"
              new GStringTemplateEngine().createTemplate(templateResource).make(templateBinding)
          }
      }
      

      然后在父模板中:

      Dear $to
      <% out.println(com.example.TemplateUtils.generateOutput("letterContent.template", variables)) %>
      Regards $from
      

      父模板的绑定变量被中继到variables 变量中的“letterContent”模板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-07
        • 2016-09-20
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 2011-05-18
        • 2018-04-22
        • 1970-01-01
        相关资源
        最近更新 更多