背景
在我的ftl
文件中,我有以下<#if>
语句
<#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
是否曾经用来表示字符串以外的内容?或者这仅仅是一个通用令牌,也可用于其他用途。 最佳答案
是的,仅用于表示Java String
。
正如API文档(JavaDoc)所说,SimpleScalar
是“ TemplateScalarModel
接口的简单实现”,而TemplateScalarModel
是“”字符串”模板语言数据类型;就像在Java中一样,不可修改的UNICODE字符序列。(此接口的名称应为TemplateStringModel
。错误名称是从旧时继承的,这是FreeMarker中唯一的单值类型。)”。数字由TemplateNumberModel
的实现表示。
顺便说一句,FreeMarker 2.3.20具有较少的隐秘类型错误消息。它讨论了字符串,数字,布尔值等。SimpleScalar
以及因果关系的FreeMarker用户不必担心的技术细节。