Freemarker:如何使用枚举作为键遍历Map

以下代码不起作用,因为Freemarker似乎将[]中的表达式的值强制转换为String,然后将其用作键,这并不是实际期望的值。

准备模板模型:

Map<MyEnum, Object> myMap;

myMap.put(MyEnum.FOO, "Foo");

myMap.put(MyEnum.BAR, "Bar");

templateModel.put("myMap", myMap);

my.ftl:

<#list myMap?keys as key>

<#assign value = myMap[key]>

<li>${key} = ${value}</li>

</#list>

在Freemarker文档中,描述了如何访问Enum本身,但是我没有找到有关如何使用Enum作为键从哈希中获取值的任何信息。

谢谢。

回答:

要对此释义Freemarker文档常见问题,

您不能在myMap [key]表达式中使用非字符串键。您可以使用方法!

因此,您可以创建一个bean,为您提供一种到达Java EnumMap的方法。然后只需使用您的mapp实例化该bean,然后将该bean放入模型中。

class EnumMap

{

HashMap<MyEnum, String> map = new HashMap<MyEnum, String>();

public String getValue(MyEnum e)

{

return map.get(e);

}

..constructor, generics, getters, setters left out.

}

对于您要实现的总体目标,我有些困惑。如果您只需要列出枚举的值(或者每个值的显示值)。有一种更简单的方法可以做到这一点。

我看到解决此问题的一种方法是将显示值放在Enum实例上。

enum MyEnum 

{ FOO("Foo"),

BAR_EXAMPLE("Bar Example");

private String displayValue;

MyEnum(String displayValue)

{

this.displayValue = displayValue;

}

public String getDisplay()

{

return displayValue;

}

}

这使您可以将Enum本身放入配置中,并遍历所有实例。

SimpleHash globalModel = new SimpleHash();

TemplateHashModel enumModels = BeansWrapper.getDefaultInstance().getEnumModels();

TemplateHashModel myEnumModel = (TemplateHashModel) enumModels.get("your.fully.qualified.enum.MyEnum");

globalModel.put("MyEnum", myEnumModel);

freemarkerConfiguration.setAllSharedVariables(globalModel);

然后您可以遍历枚举,

<#list MyEnum?values as item>

${item.display}

</#list>

以上是 Freemarker:如何使用枚举作为键遍历Map 的全部内容, 来源链接: utcz.com/qa/405576.html

回到顶部