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