我搜索了这些问题,发现您可以从 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 列]
有任何想法吗?