【问题标题】:Load YAML fixture for Map<Enum,Integer>为 Map<Enum,Integer> 加载 YAML 夹具
【发布时间】:2012-06-19 19:30:34
【问题描述】:

尝试在 Play 中加载一些灯具数据! 1.2.4 与 SnakeYAML。对象类型为Map&lt;enum, Integer&gt;。我在 Fixtures.loadModels("quest.yml") 上遇到的错误是“无法加载夹具 quests.yml:java.lang.String 无法转换为 java.lang.Enum”。

代码 sn-ps-

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 定义的格式以使其正常工作。有什么想法吗?

【问题讨论】:

  • 我找到了this test cases,但是当我使用它们时,我得到了以下错误exception=Class not found: models.EnumClass。我也有同样的问题^.^

标签: java playframework yaml snakeyaml


【解决方案1】:

好吧,我已经找到了 play 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 文件。游戏的结构!框架使用自己的 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));

这将使它起作用。

【讨论】:

  • 嗯,我也有同样的问题,偶然发现了相同的链接,但我用 play 2.0 尝试过,但我一直得到相同的 Class not found 异常:Yaml yaml = new Yaml(new CustomClassLoaderConstructor( Play.application().classloader()));它在 play 2.0.2 中对你有用吗?
  • 不,对不起,我没有把它放在答案中,这对我在 play 1.2.4 中有用。我现在将编辑答案。
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 2022-09-30
  • 2019-12-06
  • 1970-01-01
  • 2012-05-02
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多