簡體   English   中英

為Map添​​加YAML夾具<Enum,Integer>

[英]Load YAML fixture for Map<Enum,Integer>

試圖在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定義的格式以使其正常工作。 有任何想法嗎?

好吧,我已經為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文件。 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));

這將使它成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM