簡體   English   中英

從Java返回列表到Freemarker

[英]Returning list from Java to Freemarker

我搜索了這些問題,發現可以從Freemarker中返回列表並調用Java對象方法,但是我無法使其工作。 我嘗試從對象方法調用該方法,並使用通過TemplateMethodModelEx類實現的方法。

這是我的Freemarker:

<#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列]

有任何想法嗎?

問題出在#assign 應該是這樣的:

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

您正在使用的東西<#assign targetVar>...</#assign>用於捕獲體內生成的輸出。 這樣,它總是產生一個字符串。

(還要注意,在您顯示的示例中,您根本不需要#assign ,因為您可以將<#list filterStationRelationships(record.relationships, [1,22,23]) as rel> 。但是我假設實際模板更加復雜。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM