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,因此您可以从它的源代码中获得想法。