尝试在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定义的格式以使其正常工作。有什么想法吗?
答案 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
但后来我找到了this和this。问题发生的原因是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));
这将使它发挥作用。