Имитация нулевых параметров в макросах Freemarker

Я создаю сайт, используя Freemarker, и начал активно использовать макросы. Я знаю, что Freemarker 2.3, который передает нулевое значение в макрос в качестве параметра, эквивалентно отсутствию передачи параметра вообще, поэтому я создал глобальную переменную с именем «null» для имитации проверки на 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, которое я think вызовет toString () для обоих объектов и сравнит результат. Однако в документации конкретно говорится, что все, что связано со старыми функциями, должно быть переписано.

Мой вопрос, есть ли решение, которое не полагается на устаревшие функции?

12
задан Cameron 1 July 2011 в 20:39
поделиться