2013-08-16 64 views
0

背景

在我ftl文件我有以下<#if>聲明關於FTL的SimpleScalar的

<#if payout.paymentType.name == "StoreCredit"> 

嗯,事實證明,語句生成以下錯誤

Caused by: The only legal comparisons are between two numbers, two strings, or two dates. 
Left hand operand is a freemarker.ext.beans.SimpleMethodModel 
Right hand operand is a freemarker.template.SimpleScalar 

我花了一段時間發現它是<#if>導致問題,並且我這樣修復它

<#if payout.paymentType.name() == "StoreCredit"> 

由於某種原因,我的印象是SimpleScalar是一種數字。谷歌搜索一段時間後,我發現情況並非如此。

問題

爲什麼"StoreCredit"認爲是freemarker.template.SimpleScalar

這就是FTL代表字符串的方式嗎?

SimpleScalar是否曾經用來表示除字符串之外的其他東西?或者這只是一個通用的標記,也適用於其他用途。

+0

爲什麼需要一段時間才能找出哪個*'#if'導致問題?錯誤消息始終包含行號和列號以及失敗表達式的引用。如果它不刪除它,那麼... – ddekany

回答

1

是的,它是代表一個Java String,而且只有。

作爲API文檔(JavaDoc的)表示,SimpleScalar是「A簡單實現TemplateScalarModel接口的」,和TemplateScalarModel是「‘’字串‘’模板語言數據類型;像在Java中,一個不可修改的UNICODE字符序列(這個接口的名字應該是TemplateStringModel。這個用詞不當是從舊時代繼承而來的,當時這是FreeMarker中唯一的單值類型)。「數字由TemplateNumberModel的實現來表示。

順便說一句,FreeMarker 2.3.20有較少的神祕類型錯誤消息。它涉及字符串,數字,布爾值等。SimpleScalar等等是FreeMarker用戶不應該擔心的技術細節。

2
<if payout.paymentType.name??> 
    <#if payout.paymentType.name?string == "StoreCredit"> 
    </#if> 
</#if> 
+0

這個答案似乎是不相關的......它也會失敗,因爲'name'不是一個JavaBean屬性(因爲沒有'getName()')而是一個方法。如果不是,那麼'串'部分是多餘的。 – ddekany