【问题标题】:Why a Play template expects Scala classes为什么 Play 模板需要 Scala 类
【发布时间】:2014-11-05 15:41:18
【问题描述】:

以下模板通过将图像作为字节数组并将其编码为 Base64 来显示 PNG 图像:

@(img: Array[Byte])
<img src="data:image/png;base64,@java.util.Base64.getEncoder.encodeToString(img)">

该模板适用于使用 Scala 作为主要语言的 Play 项目:

(lazy val root = (project in file(".")).enablePlugins(PlayScala))

但是,如果一个项目使用 Java 作为其主要语言:

(lazy val root = (project in file(".")).enablePlugins(PlayJava))

运行项目时出现如下错误:

[error] C:\Java\workspace\test\app\views\imgbase64.scala.html:2: type mismatch;
[error]  found   : Array[java.lang.Byte]
[error]  required: Array[scala.Byte]
[error] <img src="data:image/png;base64,@java.util.Base64.getEncoder.encodeToString(img)">
[error]                                                                              ^
[error] one error found
[error] (compile:compile) Compilation failed

这是 Scala 2.11.4 和 Play 2.3.6

即使 Play 项目配置为使用 Java,为什么模板在这里需要 Scala 字节而不是 Java 字节?

【问题讨论】:

  • 如果你用@(img: Array[java.lang.Byte])完全限定类型会发生什么?
  • 不幸的是,没有任何变化 - 模板已经将参数类型视为 Array[java.lang.Byte],因此完全限定它并不能解决问题。
  • 我的意思是改变模板。你的意思是你得到编译错误?
  • 一个愚蠢的问题,但是您是否重新启动了您的sbt?你试过clean compile吗?
  • 完全限定参数类型不会改变任何东西,因为模板已经看到了正确的类型 (Array[java.lang.Byte]),看看它在哪里显示 [error] found : Array[java.lang.Byte]。问题是它希望找到Array[scala.Byte],我正试图了解原因。

标签: scala templates playframework playframework-2.0


【解决方案1】:

Twirl,Play 模板编译器,是基于 Scala 的。它读入模板并生成 Scala 源代码。启用 PlayJava 并不重要,这不会改变 Twirl 编译器生成的内容。我建议你查看 target/scala_2.X/twirl 下的源代码,看看 Twirl 生成了什么以及 Scala 编译器试图编译什么。 Twirl 可能已将模板中的 Byte 解释为 scala.Byte 并输出完全限定的类名。如果您打算使用 Byte 的 java 版本,则需要在模板中更加具体。

【讨论】:

  • 感谢您的回答。我不明白你在我的模板中更具体是什么意思 - 将模板参数完全限定为 Array[java.lang.Byte] 无效,因为模板已经将其视为这种类型 ([error] found : Array[java.lang.Byte])
  • 我的意思是将它完全限定为 scala.Byte,就像在 @(img: Array[scala.Byte]) 中一样。编译器期望它是那种类型。
猜你喜欢
  • 2014-11-28
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多