Я создаю сайт с помощью Freemarker и начал активно использовать макросы. В Freemarker 2.3 я знаю, что передача нулевого значения в макрос в качестве параметра равносильна не передаче параметра вообще, поэтому я создал глобальную переменную с именем «null» для имитации проверки на нуль в моих макросах:
<#assign null="NUL" />
Теперь в моих макросах я могу сделать это:
<#maco doSomething param1=null>
<#if param1 != null>
<div>WIN!</div>
</#if>
</#macro>
Проблема возникает, если я хочу передать параметр, который не является скалярным. Например, передача списка (который в Freemarker является SimpleSequence) макросу и проверка по моему пустому ключевому слову приводит к ошибке:
freemarker.template.TemplateException:
Единственные правовые сравнения между
два числа, две строки или два
даты. Левый операнд является
freemarker.template.SimpleSequence
Правый операнд является
freemarker.template.SimpleScalar
Я посмотрел на код бесплатного маркера и вижу проблему (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 () для обоих объектов и сравнит результат. Однако в документации конкретно сказано, что все, что зависит от старых функций, должно быть переписано.
Мой вопрос: есть ли решение для этого, которое не полагается на устаревшие функции?