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 语句中的枚举的主要内容,如果未能解决你的问题,请参考以下文章