我正在使用Freemarker构建一个站点并且已经开始大量使用宏.我知道在Freemarker 2.3中,将空值作为参数传递给宏等同于根本不传递参数所以我创建了一个名为"null"的全局变量来模拟我的宏中的空值检查:
<#assign null="NUL" />
Run Code Online (Sandbox Code Playgroud)
现在在我的宏中我可以这样做:
<#maco doSomething param1=null>
<#if param1 != null>
<div>WIN!</div>
</#if>
</#macro>
Run Code Online (Sandbox Code Playgroud)
如果我想传递一个不是标量的参数,问题就来了.例如,将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 …Run Code Online (Sandbox Code Playgroud) freemarker ×1