Загрузить фикстуру YAML для Map‹Enum,Integer›

Попытка загрузить некоторые данные прибора в Play! 1.2.4 со ЗмеейYAML. Тип объекта 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 

Как видите, я указал, что хочу использовать строковое значение перечисления STATS с аннотацией @MapKeyEnumerated. Я не уверен, как изменить формат определения yml, чтобы он работал правильно. Любые идеи?


person TheRyanBurke_AWS    schedule 17.06.2012    source источник
comment
Я нашел эти тестовые примеры, но когда я их использую, я получаю следующую ошибку exception=Class not found: models.EnumClass. У меня такая же проблема ^.^   -  person Chango    schedule 20.07.2012


Ответы (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) создает свой собственный ClassLoader для анализа файла .yml. Структура игры! 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));

И это заставит его работать.

person Chango    schedule 19.07.2012
comment
Хм, у меня та же проблема, и я наткнулся на те же ссылки, но я попробовал это с игрой 2.0, и я продолжаю получать одно и то же исключение Class not found: Yaml yaml = new Yaml(new CustomClassLoaderConstructor(Play.application().classloader( ))); У вас работает в play 2.0.2? - person baraber; 25.07.2012
comment
Нет, извините, я не указал это в ответе, у меня это сработало в игре 1.2.4. Я отредактирую ответ сейчас. - person Chango; 25.07.2012