Ale*_*yda 13 java enums freemarker key map
以下代码不起作用,因为Freemarker似乎将[]中的表达式的值转换为String,然后将其用作键,这不是实际预期的.
准备模板模型:
Map<MyEnum, Object> myMap;
myMap.put(MyEnum.FOO, "Foo");
myMap.put(MyEnum.BAR, "Bar");
templateModel.put("myMap", myMap);
Run Code Online (Sandbox Code Playgroud)
my.ftl:
<#list myMap?keys as key>
<#assign value = myMap[key]>
<li>${key} = ${value}</li>
</#list>
Run Code Online (Sandbox Code Playgroud)
在Freemarker文档中,它描述了如何访问Enum本身,但我没有找到任何关于如何使用Enum作为键从哈希值中获取值的信息.
谢谢.
And*_*ndy 12
您不能在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.
}
Run Code Online (Sandbox Code Playgroud)
我对你想要达到的目标有点困惑.如果您只需要列出枚举值(或者每个值的显示值).有一种更容易的方法来做到这一点.
我看到这个问题解决的一种方法是在Enum实例上放置一个显示值.
即
enum MyEnum
{ FOO("Foo"),
BAR_EXAMPLE("Bar Example");
private String displayValue;
MyEnum(String displayValue)
{
this.displayValue = displayValue;
}
public String getDisplay()
{
return displayValue;
}
}
Run Code Online (Sandbox Code Playgroud)
这允许您将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);
Run Code Online (Sandbox Code Playgroud)
然后你可以遍历枚举,
<#list MyEnum?values as item>
${item.display}
</#list>
Run Code Online (Sandbox Code Playgroud)