3

尝试在 Play 中加载一些夹具数据!1.2.4 与 SnakeYAML。对象类型为Map<enum, Integer>。我在 Fixtures.loadModels("quest.yml") 上遇到的错误是“无法加载夹具 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 定义的格式以使其正常工作。有任何想法吗?

4

1 回答 1

1

好吧,我已经为 play 1.2.4 找到了一个“解决方案”,它很丑,但它确实有效。

我发现的第一件事是这个测试用例,它显示了你应该如何做:

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

但后来我发现了这个这个。出现问题是因为 Yaml 解析器 (snakeyaml) 创建了自己的 ClassLoader 以解析 .yml 文件。游戏的结构!框架使用自己的 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));

这将使它发挥作用。

于 2012-07-19T23:06:14.360 回答