Freemarker:if 语句中的枚举

Posted

技术标签:

【中文标题】Freemarker:if 语句中的枚举【英文标题】:Freemarker: an enum in an if statement 【发布时间】:2012-09-07 11:25:43 【问题描述】:

在我的 if 语句中,我想将一个变量(JDK 1.5 枚举)与一个枚举文字进行比较。例如:

<#if type == ProblemStatisticType.BEST_SOLUTION_CHANGED>
  ...
</#if>

但我得到了这个例外:

freemarker.core.InvalidReferenceException: Expression ProblemStatisticType is undefined on line 430, column 87 in index.html.ftl.
at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:135)

我该怎么做?

【问题讨论】:

您也可以使用@ControllerAdvice 类,并指定一个ModelAttribute 方法,将枚举添加到模型中 【参考方案1】:

不幸的是,FreeMarker 语言没有类的概念......但你可以这样做:

<#if type.name() == "BEST_SOLUTION_CHANGED">
  ...
</#if>

或者,如果您信任枚举类型的 toString(),则可以省略 .name() 部分。

【讨论】:

【参考方案2】:

如果你想比较枚举,你应该在双引号中指定一个常量枚举值,例如:

<#if type == "BEST_SOLUTION_CHANGED">
  ...
</#if>

【讨论】:

这行得通,但它对重构并不友好。如果枚举覆盖了 toString() 方法怎么办?【参考方案3】:

我已经成功使用过类似的东西(在 java 1.6 和 1.7 中,没有尝试过 1.5):

<#if type?? && statics["com.your.package.ContainingClass$TypeEnum"].BEST_SOLUTION_CHANGED.equals(type)>
  Do some freemarker or HTML here
</#if>

这是另一个类中的枚举,例如:

class ContainingClass 
   public enum TypeEnum 
    WORST(0),
    BEST_SOLUTION_CHANGED(1);

    private int value;

    private TypeEnum(int value) 
      this.value = value;
    

    public int value() 
      return this.value;
    
  ;  

类型变量在java中定义如下:

TypeEnum type = TypeEnum.BEST_SOLUTION_CHANGED;

【讨论】:

以上是关于Freemarker:if 语句中的枚举的主要内容,如果未能解决你的问题,请参考以下文章

FreeMarker 模板中的 if-else

FreeMarker 当前日期比较

Freemarker/Velocity - 日期操作

如何在 freemarker 中评估 if 语句?

网页静态化FreeMarker的使用

Spring mvc整合freemarker详解