Freemarker中的Switch Case:TemplateException

时间:2012-10-04 06:28:45

标签: templates exception freemarker

这是我的testMacro.txt

<#macro myMacro value1 value2>
<#list 1..value1 as x>
 <#if x=value1>
      <#switch value2>
           <#case value2 = 1>
                CASE1    
           <#break>
           <#case value2 =2 >
                CASE2   
           <#break>
           <#case value2 = 3>
                CASE3    
           <#break>
      </#switch>
 <#else>
             ELSE
 </#if>
</#list>

<@myMacro value1=3 value2=1 />

这是我得到的例外情况。

Exception in thread "main" java.lang.RuntimeException: freemarker.template.TemplateException: The only legal comparisons are between two numbers, two strings, or two dates. Left hand operand is a freemarker.template.SimpleNumber Right hand operand is a freemarker.template.TemplateBooleanModel$2

现在这是在switch case语句中,虽然在异常中没有给出行号,但是我对switch语句进行了评论并且没有异常,因此我得出结论,它与case语句存在一些问题。

请帮助。

2 个答案:

答案 0 :(得分:3)

由于历史原因,===的别名,但在预期转让的地方除外。因此'<#case value2 = 1>''<#case value2 == 1>',因此最终为'<#case true>''<#case false>',因此出现错误消息。正如你所想的那样,它应该是'<#case 1>'等等,就像在C-ish语言中一样。截至手册中的最后一个例子,该例子是错误的......

答案 1 :(得分:1)

事实证明,如果我做以下

       <#case 1>
            CASE1    
       <#break>
       <#case 2 >
            CASE2   
       <#break>
       <#case 3>
            CASE3    
       <#break>
然后它似乎确实有效。虽然我不明白为什么它不适用于表达式,因为我从Freemarker Manual

看到了