[英]How to map C integer to Java enum via JNA using TypeConverter?
[英]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.