我正在使用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)
型
1条答案
按热度按时间eagi6jfj1#
请注意,您还没有将内部
data
Map转换为Java Map:字符串
(you只将
.asJava
应用于root
Map)。也许这就是这里的问题。如果不是,那么我会更仔细地注意你得到的错误,即“预期一个字符串或自动转换为字符串的东西(数字,日期或布尔值)"。听起来,FreeMarker只想在这里看到简单的类型(而不是Map)。但是,除此之外,尝试将Scala代码与像FreeMarker这样的专注于Java的库结合在一起,会导致这样的问题。您可以考虑使用Twirl而不是Freemarker,以获得方便且类型安全的模板解决方案。