为Map <enum,integer> </enum,integer>加载YAML fixture

时间:2012-06-17 15:31:16

标签: java playframework yaml snakeyaml

尝试在Play中加载一些灯具数据! 1.2.4使用SnakeYAML。对象类型为Map<enum, Integer>。错误我得到的Fixtures.loadModels(“quest.yml”)是“无法加载fixture quests.yml:java.lang.String无法转换为java.lang.Enum”。

代码段 -

Constants.java
public enum STATS {
        CREATIVITY, ENTHUSIASM, ...
}

Quest.java
@ElementCollection
@MapKeyEnumerated(EnumType.STRING)
public Map<Constants.STATS, Integer> reward;

quest.yml
Quest(sirlin):
    reward:
        CREATIVITY: 1 

正如您所看到的,我已经指定我想使用带有@MapKeyEnumerated注释的枚举STATS的String值。我不知道如何更改yml定义的格式以使其正常工作。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好吧,我已经为1.2.4发现了一个“解决方案”,它很难看,但它确实有效。

我发现的第一件事是this test case,它显示了你应该怎么做:

map:
  !!org.pacakge.EnumClass 'CLUBS': 1
  !!org.pacakge.EnumClass 'DIAMONDS': 2

这会给枚举作为键的地图。

但它不起作用,因为它给出了这个例外:

Can't construct a java object for tag:yaml.org,2002:models.Plazos; exception=Class not found: org.pacakge.EnumClass

但后来我找到了thisthis。问题发生的原因是Yaml解析器(snakeyaml)创建了自己的ClassLoader以解析.yml文件。 Play的结构! framework使用自己的ClassLoader。解决方案是替换这个

Yaml y = new Yaml();

用这个

Yaml y = new Yaml(new CustomClassLoaderConstructor(playClassLoader));

但是,当然,这是在play.test.Fixtures课程内完成的,那么我的解决方案是什么?好吧,将该类复制到您的项目中,并在方法loadModels中替换此行:

Yaml yaml = new Yaml();

这一个:

Yaml yaml = new Yaml(new CustomClassLoaderConstructor(Play.classloader));

这将使它发挥作用。