StringTemplate找不到getter方法

3

我正在使用ST-4.0.7.jar,我的模板如下:

backtrack_result(btresult) ::=<<
    <backtrack-result>
        <pattern id="$btresult.pattern.id$">$btresult.pattern.description$</pattern>
        <file>$btresult.file.file.path$</file>
        <line>$btresult.codeline.lineNr$</line>
        <method>$btresult.codeline.method.name$</method>        
    </backtrack-result>
>>

然而,当我查看我的输出文件时,我只得到
<method></method>

在BTResult中:

public CodeLineInterface getCodeline() {
    return cl;
} 

在 CodeLine 中:

public MethodInterface getMethod() {
    return method;
}

在方法中:

public String getName() {
    return name;
}

我在 getMethod 方法的代码行对象中设置了一个断点,但它从来没有被调用。 因此我得出结论,某种方式下 stringtemplate 有问题解析正确的 getter。
我添加了 STErrorListener 并发现 ST 抛出以下错误:
STReportGenerator  - context [/report /backtrack_results /backtrack_result] 5:19 no such property or can't access: ju.no.need.toknow.BTResult.method
Caused by: org.stringtemplate.v4.misc.STNoSuchPropertyException: no such property: ju.no.need.toknow.BTResult.method
    at org.stringtemplate.v4.misc.ObjectModelAdaptor.throwNoSuchProperty(ObjectModelAdaptor.java:106)
    at org.stringtemplate.v4.misc.ObjectModelAdaptor.lookupMethod(ObjectModelAdaptor.java:99)
    at org.stringtemplate.v4.misc.ObjectModelAdaptor.getProperty(ObjectModelAdaptor.java:67)
    at org.stringtemplate.v4.Interpreter.getObjectProperty(Interpreter.java:1158)

这让我感到困惑的是:为什么它尝试解析成BTReult.method,而不是模板中指定的btresult.codeline.method.name呢?


1
只是为了确认一下:你的 getMethod 是一个公共实例方法,对吗? - Sergey Kalinichenko
如果您在 getLineNr() 中设置了断点,它会被触发吗?如果没有,我建议您在 getCodeline() 中设置断点,以查看其返回值。 - monty0
getLineNr 显然被触发了,因为我可以在我的 XML 文档中看到正确的值。我开始想知道这是否与方法的名称有关。也许是与反射相关的一些奇怪的边缘情况,ST 使用它来猜测 getter。 - er4z0r
1个回答

2

好的。这是我的疏忽:我虽然修复了模板,但实际上使用的是旧模板,所以看起来所有的修复都没有生效。这是OSI第8层问题 ;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接