【发布时间】:2011-09-27 00:52:08
【问题描述】:
我正在使用 Freemarker 构建一个网站,并开始大量使用宏。我知道在 Freemarker 2.3 中将 null 值作为参数传递给宏相当于根本不传递参数,因此我创建了一个名为“null”的全局变量来模拟宏中的 null 检查:
<#assign null="NUL" />
现在在我的宏中我可以这样做:
<#maco doSomething param1=null>
<#if param1 != null>
<div>WIN!</div>
</#if>
</#macro>
如果我想传递一个不是标量的参数,问题就来了。例如,将 List(在 Freemarker 中是 SimpleSequence)传递给宏并检查我的 null 关键字会产生错误:
freemarker.template.TemplateException: 唯一合法的比较是 两个数字、两个字符串或两个 日期。左手操作数是 freemarker.template.SimpleSequence 右手操作数是 freemarker.template.SimpleScalar
我查看了freemarker代码,我可以看到问题(ComparisonExpression.isTrue()):
if(ltm instanceof TemplateNumberModel && rtm instanceof TemplateNumberModel) {
...
}
else if(ltm instanceof TemplateDateModel && rtm instanceof TemplateDateModel) {
...
}
else if(ltm instanceof TemplateScalarModel && rtm instanceof TemplateScalarModel) {
...
}
else if(ltm instanceof TemplateBooleanModel && rtm instanceof TemplateBooleanModel) {
...
}
// Here we handle compatibility issues
else if(env.isClassicCompatible()) {
...
}
else {
throw new TemplateException("The only legal comparisons...", env);
}
所以我能想到的唯一解决方案是将 isClassicCompatible 设置为 true,我认为这会在两个对象上调用 toString() 并比较结果。但是,文档明确指出,任何依赖旧功能的东西都应该重写。
我的问题是,是否有不依赖于已弃用功能的解决方案?
【问题讨论】:
标签: freemarker