2

StringBuildersの代わりにGroovyのSimpleTemplateEngineを使用して出力を生成しようとしていますが、クラス内の他のメソッドを正常に呼び出すためのテンプレートを取得できません(最終的に他のテンプレートを呼び出してネストされたチェーンを形成します)。

テンプレート(以下の例)がメソッド<% generateItemOutput(itemDescriptor.itemList) %>を呼び出すと、例外が発生します。

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

すべてのメソッドを静的にし、テンプレートの静的メソッドにインポートを追加しようとしましたが(ここで提案されているように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 ;
                      ^

これが私がsなしでやっていることのサンプルですstatic

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スクリプトで静的メソッドへのパッケージパスを計算できないためです。

テンプレート内から独自のスクリプト/クラスメソッドを呼び出す具体的な例を誰かが持っていますか、または私が間違っていることを教えてもらえますか?

乾杯。

4

2 に答える 2

2

わかりました、私はそれをうまく動かすことができました、そしてそれは結局かなり単純でした。インポートを実行する代わりに、すべての生成メソッドとテンプレートメソッドに静的なものを使用してから、完全修飾パッケージ名をテンプレート内のメソッドに追加する必要がありました。

また、コマンドに印刷がないこともわかりました。固定テンプレートは次のとおりです。

public static String itemDescriptorTemplate() {
    return = '''\
${itemDescriptor.name} {
repository = "${itemDescriptor.repository}"
props = [
    <% print uk.co.e2x.convert.XMLToSlurp.generateItemOutput(itemDescriptor.itemList) %>
]
}
'''
于 2012-05-30T14:32:38.777 に答える
0

次のような静的ユーティリティメソッドを使用して、ネストされたテンプレートを親テンプレート内に含めます。

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

親テンプレートのバインドされた変数は、変数の「letterContent」テンプレートに中継されvariablesます。

于 2019-05-06T22:46:40.877 に答える