Scala 将 Some(.) 返回给 Freemarker
Scala returning Some(.) to Freemarker
我有以下 scala 和 freemarker 代码:
val cfg = new Configuration(Configuration.VERSION_2_3_23)
cfg.setDirectoryForTemplateLoading(new File("/Users/simonshapiro/IdeaProjects/Neo4EmbeddedTest/src/main/scala-2.11/informationModel/kernel/templates"))
cfg.setDefaultEncoding("UTF-8")
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER)
val template = cfg.getTemplate("test.ftl")
val out = new StringWriter
val data = new mutable.HashMap[String, Any]
data("name") = "fred"
data("age") = 27
template.process(data, out)
println(out.toString)
test.ftl 包含:
Hi ${name}(${age})
one two three
这个短程序的输出是:
Hi Some(fred)(Some(27))
one two three
如果生成的模板中的字符串值周围没有 Some(.) 文本,应该如何获得输出?
Freemarker 使用 map.get("key")
在模板中提取参数。
new mutable.HashMap
支持 get("key")
函数,但它 returns Option[Any]
而不是值本身。
我建议您改用通用 java.util.HashMap
。
例如,您可以使用以下方法将地图转换为 java:
import scala.collection.JavaConverters._
map.asJava
FreeMarker 通过 ObjectWrapper
将对象映射到模板语言类型。所以你可以扩展 DefaultObjectWrapper
来专门包装 Some
-s,然后通过 Configuration.setObjectWrapper(ObjectWrapper)
设置你自己的 ObjectWrapper
。请注意,DefaultObjectWrapper
已经通过添加一些经过特殊处理的 类 扩展了 BeansWrapper
,因此您可以从它的源代码中获得想法。
我有以下 scala 和 freemarker 代码:
val cfg = new Configuration(Configuration.VERSION_2_3_23)
cfg.setDirectoryForTemplateLoading(new File("/Users/simonshapiro/IdeaProjects/Neo4EmbeddedTest/src/main/scala-2.11/informationModel/kernel/templates"))
cfg.setDefaultEncoding("UTF-8")
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER)
val template = cfg.getTemplate("test.ftl")
val out = new StringWriter
val data = new mutable.HashMap[String, Any]
data("name") = "fred"
data("age") = 27
template.process(data, out)
println(out.toString)
test.ftl 包含:
Hi ${name}(${age})
one two three
这个短程序的输出是:
Hi Some(fred)(Some(27))
one two three
如果生成的模板中的字符串值周围没有 Some(.) 文本,应该如何获得输出?
Freemarker 使用 map.get("key")
在模板中提取参数。
new mutable.HashMap
支持 get("key")
函数,但它 returns Option[Any]
而不是值本身。
我建议您改用通用 java.util.HashMap
。
例如,您可以使用以下方法将地图转换为 java:
import scala.collection.JavaConverters._
map.asJava
FreeMarker 通过 ObjectWrapper
将对象映射到模板语言类型。所以你可以扩展 DefaultObjectWrapper
来专门包装 Some
-s,然后通过 Configuration.setObjectWrapper(ObjectWrapper)
设置你自己的 ObjectWrapper
。请注意,DefaultObjectWrapper
已经通过添加一些经过特殊处理的 类 扩展了 BeansWrapper
,因此您可以从它的源代码中获得想法。