在FreeMarker模板中列出Scala Map值失败

d7v8vwbk  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(72)

我正在使用Freemarker v 2.3.32,并试图列出一个自由标记模板中的map的值。但我的单元测试失败,并出现以下错误:
Freemarker.core.NonStringOrTemplateOutputException:For“${...}”content:预期一个字符串或自动转换为字符串的东西(数字,日期或布尔值),或“模板输出”,但这已经评估为一个方法+序列( Package 器:f.e.b.SimpleMethodModel):[info] ==> v [in template“test.ftl”at line 22,column 11]
下面是我的代码:
test.ftl:

<ul>
<#list params as k,v>
    <li>${v}</li>
<#else>
   <p>Empty map</p>
</#list>
</ul>

个字符
在单元测试中,我执行以下操作:

val out = new StringWriter
      testTemplate.process(sampleHtmlTemplateWithMap, out)


我可以打印Scala数组元素,字符串元素等。没有任何问题。但我似乎不能访问FTL中的Map值。有人能告诉我我做错了什么吗?
当我这样做时,我得到了同样的错误。

<#list params?values as v>
    <li>${v}</li>
<#else>
   <p>Empty map</p>
</#list>
</ul>


但是当我尝试使用这些键时,我看到了一大堆Scala.collections方法,而且这次没有错误!但这不是我想要的

<#list params?keys as k>
    <li>${k}</li>
<#else>
   <p>Empty map</p>
</#list>
</ul>


另外请注意,如果我指定键,我可以在FTL中单独访问Map元素。

${params["param1"]}


它又回来了

Some(artifact1)


我可以看到整个Map被打印出来,当我这样做:

${params}


作为

Map(param1 -> artifact1, param2 -> artifact2)

eagi6jfj

eagi6jfj1#

请注意,您还没有将内部dataMap转换为Java Map:

val data = Map("param1" -> "artifact1",
      "param2" -> "artifact2")

字符串
(you只将.asJava应用于rootMap)。也许这就是这里的问题。如果不是,那么我会更仔细地注意你得到的错误,即“预期一个字符串或自动转换为字符串的东西(数字,日期或布尔值)"。听起来,FreeMarker只想在这里看到简单的类型(而不是Map)。
但是,除此之外,尝试将Scala代码与像FreeMarker这样的专注于Java的库结合在一起,会导致这样的问题。您可以考虑使用Twirl而不是Freemarker,以获得方便且类型安全的模板解决方案。

相关问题