gpt4 book ai didi

java - Freemarker:如何使用枚举作为键来遍历 map

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:06 26 4
gpt4 key购买 nike

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

准备模板模型:

Map<MyEnum, Object> myMap;
myMap.put(MyEnum.FOO, "Foo");
myMap.put(MyEnum.BAR, "Bar");
templateModel.put("myMap", myMap);

我的.ftl:

<#list myMap?keys as key>
<#assign value = myMap[key]>
<li>${key} = ${value}</li>
</#list>

Freemarker documentation它描述了如何访问枚举本身,但我没有找到任何关于如何使用枚举作为键从哈希中获取值的信息。

谢谢。

最佳答案

释义Freemarker Documentation FAQ对此,

You can't use non-string keys in the myMap[key] expression. You can use methods!

因此,您可以创建一个 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 MyEnum 
{ FOO("Foo"),
BAR_EXAMPLE("Bar Example");
private String displayValue;

MyEnum(String displayValue)
{
this.displayValue = displayValue;
}

public String getDisplay()
{
return displayValue;
}
}

这允许您将枚举本身放入您的配置中,并迭代所有实例。

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>

关于java - Freemarker:如何使用枚举作为键来遍历 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5422412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com