1

我搜索了这些问题,发现您可以从 Freemarker 中返回列表并调用 Java 对象方法,但是我无法让它工作。我尝试从对象方法调用该方法并使用使用 TemplateMethodModelEx 类实现的方法。

这是我的自由标记:

<#assign relations>
       ${filterStationRelationships(record.relationships, [1,22,23])}
</#assign>

<relationships>
    <#list relations as rel>
    <relationship type="${rel.name}">${rel.sourceId1!"NO STATION"}</relationship>
    </#list>
</relationships>

这是我的 Java(实际上是 Groovy):

@BoundClass(bindingName="filterStationRelationships")
class FilterStationRelationships implements TemplateMethodModelEx {

@Override
public List<StationRelationship> exec(List args) throws TemplateModelException {
    if (args.size() != 2) {
        throw new TemplateModelException('FilterStationRelationships needs two arguments')
    }
    List<StationRelationship> stationRels = (List<StationRelationship>)DeepUnwrap.unwrap(args[0])
    List<Integer> typeIds = (List<Integer>)DeepUnwrap.unwrap(args[1])

    Map map = new HashMap();

    stationRels.findAll { rel ->
        typeIds.contains(rel.typeId)
    }

}

}

我已经验证了 args 在 Groovy 中是有效的,但是当它将 List 发送回 Freemarker 时,我得到了这个:

<relationships>

预期的集合或序列。在 default-groovy-template 中的第 24 行第 24 列,将关系评估为 freemarker.template.SimpleScalar。有问题的指令:

==> 将关系列为 rel [在 default-groovy-template 中的第 24 行,第 17 列]

有任何想法吗?

4

1 回答 1

2

问题出在#assign. 它应该是这样的:

<#assign relations = filterStationRelationships(record.relationships, [1,22,23])>

您正在使用的东西<#assign targetVar>...</#assign>是用于捕获体内生成的输出。因此,它总是产生一个字符串。

(另请注意,在您展示的示例中,您根本不需要#assign,因为您可以只写<#list filterStationRelationships(record.relationships, [1,22,23]) as rel>。但我假设真正的模板更复杂。)

于 2013-11-06T10:36:24.500 回答