0

背景

在我的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">

出于某种原因,我的印象是 aSimpleScalar是一种数字。谷歌搜索了一段时间后,我发现事实并非如此。

问题

为什么被"StoreCredit"认为是freemarker.template.SimpleScalar

这就是 FTL 表示字符串的方式吗?

SimpleScalar曾经用来表示字符串以外的东西吗?或者这只是一个用于其他用途的通用令牌。

4

2 回答 2

2
<if payout.paymentType.name??>
    <#if payout.paymentType.name?string == "StoreCredit">
    </#if>
</#if>
于 2013-08-16T17:49:36.803 回答
1

是的,它仅用于表示 Java String,仅此而已。

正如 API 文档 (JavaDoc) 所说,SimpleScalar是“TemplateScalarModel接口的简单实现”,TemplateScalarModel是“''string'' 模板语言数据类型;就像在 Java 中一样,是不可修改的 UNICODE 字符序列。(此接口的名称应该是TemplateStringModel。这个误称是从旧时代继承下来的,当时这是 FreeMarker 中唯一的单值类型。)”。数字由 的实现表示TemplateNumberModel

顺便说一句,FreeMarker 2.3.20 的类型错误消息更少。它讨论了字符串、数字、布尔值等SimpleScalar,这些都是 FreeMarker 因果用户不应该担心的技术细节。

于 2013-08-17T08:14:41.593 回答