2012-06-17 21 views
3

試圖加載Play中的一些燈具數據! 1.2.4與SnakeYAML。對象類型是Map<enum, Integer>。錯誤我得到Fixtures.loadModels(「quest.yml」)是「無法加載夾具quests.yml:java.lang.String不能轉換爲java.lang.Enum」。加載YAML燈具的地圖<枚舉,整數>

代碼snippets-

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定義的格式以正確工作。有任何想法嗎?

+0

我發現[此測試用例](http://code.google.com/p/snakeyaml/source/browse/src/test/java/org/yaml/snakeyaml/EnumTest.java?name=v1。 0.1&r = 2ce78be1172188f4ea505cbd7b947a30c6a02e96),但是當我使用它們時,出現以下錯誤:exception = Class not found:models.EnumClass'。我有同樣的問題^。^ – Chango

回答

1

那麼,我發現了一個'解決方案'的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文件。 Play的結構!框架使用它自己的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)); 

這將使它發揮作用。

+0

嗡嗡聲,我有同樣的問題,並偶然發現相同的鏈接,但我試着玩2.0和我一直得到相同的類沒有發現異常: Yaml yaml = new Yaml (新的CustomClassLoaderConstructor(Play.application()。classloader())); 它在2.0.2中適合你嗎? – baraber

+0

不,對不起,我沒有把它放在答案中,這對我在1.2.4中起作用。我現在編輯答案。 – Chango