背景

在我的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用户不必担心的技术细节。

10-08 12:43