gpt4 book ai didi

java - 为 Map 加载 YAML fixture

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:06 25 4
gpt4 key购买 nike

正在尝试在 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 的字符串值。我不确定如何更改 yml 定义的格式以使其正常工作。有什么想法吗?

最佳答案

好吧,我找到了 play 1.2.4 的“解决方案”,它很丑陋,但它有效。

我首先找到的是this test case , 这表明你应该如何去做:

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

这将给出一个以枚举作为键的映射。

但它不起作用,因为它给出了这个异常(exception):

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 文件。游戏的结构!框架使用它自己的 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));

这将使它发挥作用。

关于java - 为 Map<Enum,Integer> 加载 YAML fixture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com