3

Playでフィクスチャデータをロードしようとしています!1.2.4SnakeYAMLを使用。オブジェクトタイプは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定義の形式を変更する方法がわかりません。何か案は?

4

1 に答える 1

1

まあ、私は遊び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)が.ymlファイルを解析するために独自のClassLoaderを作成するために発生します。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));

そしてそれはそれを機能させるでしょう。

于 2012-07-19T23:06:14.360 に答える