【问题标题】:Freemarker: an enum in an if statementFreemarker:if 语句中的枚举
【发布时间】:2026-01-29 09:25:02
【问题描述】:

在我的 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 方法,将枚举添加到模型中

标签: java freemarker


【解决方案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;
    

    【讨论】: