Java 为地图加载YAML夹具<;枚举,整数>;

Java 为地图加载YAML夹具<;枚举,整数>;,java,playframework,yaml,snakeyaml,Java,Playframework,Yaml,Snakeyaml,正在尝试加载游戏中的一些夹具数据!1.2.4使用SnakeYAML。对象类型为Map。获取fixture时出错。loadModels(“quest.yml”)是“无法加载fixture quests.yml:java.lang.String无法转换为java.lang.Enum” 代码片段- Constants.java public enum STATS { CREATIVITY, ENTHUSIASM, ... } Quest.java @ElementCollection

正在尝试加载游戏中的一些夹具数据!1.2.4使用SnakeYAML。对象类型为
Map
。获取fixture时出错。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 
Constants.java
公共枚举统计数据{
创造力、热情。。。
}
java
@元素集合
@MapKeyEnumerated(EnumType.STRING)
公众地图奖励;
探索
任务(瑟林):
奖励:
创意:1

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

好吧,我已经为游戏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)创建了自己的类加载器来解析.yml文件。这出戏的结构!框架使用自己的类加载器。解决办法是取代这个

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));

这将使它工作。

我已经找到了,但是当我使用它们时,我得到了以下错误
exception=classnotfound:models.EnumClass
。我也有同样的问题^。^嗯,我也有同样的问题,并且偶然发现了同样的链接,但是我在play 2.0中尝试过,我一直得到同样的类not found异常:Yaml Yaml=new Yaml(new CustomClassLoaderConstructor(play.application().classloader());在游戏2.0.2中它对你有效吗?不,对不起,我没有把它放在答案中,这在游戏1.2.4中对我有效。我现在编辑答案。