【问题标题】:Freemarker function that return map value返回地图值的 Freemarker 函数
【发布时间】:2014-08-16 01:27:09
【问题描述】:

我有一些 Java 地图

    Map<SomeEnum, Boolean> someClassMap = new HashMap <SomeClass, Boolean>();
    someClassMap.put(SomeEnum.EXAMPLE_A, true);
    etc.

现在在 ftl 中,我想创建一个函数,该函数将从 map 中返回值(ofc 通过给定键)

<#function checkAccess someEnumName>
    <#list someClassMap?keys as key>
        <#if someEnumName== ${key}>
            <#return ${someClassMap[key]} >
        </#if>
    </#list> 
</#function>

所以这段代码假设检查函数中的给定参数是否等于映射中的键,然后从映射中返回该键的值。

不幸的是,我收到了这个错误(它指向&lt;#if&gt;&lt;#return&gt;

在 functions.ftl 的第 3 行第 37 列遇到“{”。曾是 期待其中之一: ">" ... “。” ... “[”... “(”…… “?” ... “!” ... ... “??” ... “+” ... “——”…… “*” ... “/” ... “%” ... ">=" ... ... ">" ... ... ... ... “..” ... ... ...

据我了解,我无法返回这样的值,但不幸的是我不知道该怎么做。我也试过&lt;#assign ... &gt;,但出现同样的错误

【问题讨论】:

    标签: java freemarker


    【解决方案1】:

    在您的情况下,您将 Freemarker 标记与插值 (${}) 混合使用。
    Freemarker 在调用 ${x} 时尝试渲染/打印 x 的字符串值。


    所以当你这样做时:

    <#if someEnumName== ${key}>
    

    <#return ${someClassMap[key]} >
    

    Freemarker 将尝试打印 ${key}${someClassMap[key]}


    在 Freemarker 标签中混合插值是不正确的语法,导致 Freemarker 抱怨。
    只需删除 ${} 就可以了。

    有关详细信息,请参阅以下内容:

    1. Freemarker template structure (Interpolation vs Freemarker tags)
    2. Interpolation (check the section with "Warning!")

    【讨论】:

    • 知道如何使用字符串参数调用该函数吗? ${checkAccess("test") 对我不起作用,如果我将测试分配给变量并将该变量作为参数函数传递它也不起作用
    • 我不确定“不起作用”是什么意思,但我猜 从来都不是真的,所以你永远不要返回任何东西。可能的问题: 1. someClassMap?keys 是空的,所以你永远不会用 迭代任何东西 2. someEnumName 是一个字符串,而 key 是一个 SomeEnum。当您比较 someEnumName== key 时,所进行的比较可能是 someEnumName== key.toString(),这可能不是您所期望的。
    • checkAccess("test") 返回一个布尔值,因此${true} 将打印 true${false} 将不打印任何内容。所以改为尝试${checkAccess("test")?string}。见link
    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 2021-04-14
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多