2014-11-05 40 views
-1

下面的模板,通過拍攝圖像作爲一個字節數組,其編碼爲Base64編碼顯示PNG圖像:爲什麼玩模板期望Scala類

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

模板適用於使用Scala的做播放項目的主要語言:

(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 

這是斯卡拉2.11.4和播放2.3.6

爲什麼模板期望斯卡拉字節而不是Java字節在這裏,即使:運行時,該項目被認爲是以下錯誤Play項目被配置爲使用Java?

+0

如果通過@(img:Array [java.lang.Byte])完全限定類型,會發生什麼? – 2014-11-05 16:32:56

+0

不幸的是沒有任何變化 - 模板已經將參數類型視爲Array [java.lang.Byte],因此完全限定它並不能解決問題。 – Sevas 2014-11-05 16:52:25

+0

我的意思是改變模板。你的意思是你得到編譯錯誤? – 2014-11-05 16:55:09

回答

0

Twirl是Play模板編譯器,基於Scala。它讀入模板並生成Scala源代碼。啓用PlayJava並不重要,它不會改變Twirl編譯器生成的內容。我建議你看看target/scala_2.X/twirl下的源代碼,看看生成了哪些Twirl以及Scala編譯器試圖編譯什麼。旋轉可能會將Byte解釋爲scala.Byte,並輸出完全限定的類名稱。如果您打算使用Java版本的Byte,則需要在模板中更具體。

+0

謝謝你的回答。我不明白你的意思是在我的模板中更具體 - 完全限定模板參數爲'Array [java.lang.Byte]'沒有效果,因爲模板已經看到它是這種類型的('[error] found :Array [java.lang.Byte]') – Sevas 2014-11-08 08:30:47

+0

我的意思是完全限定它爲scala.Byte在@(img:Array [scala.Byte])中。編譯器期望它是那種類型。 – 2014-11-08 16:39:46