Сбой findAll после повторной инициализации play morphia

У меня есть следующий класс, который сохраняется в mongodb, используя morphia в игре! заявление. Класс находится в модуле, который является зависимостью от другой игры! заявление.

Его конфигурация считывается из файла и сохраняется в базе данных при начальной загрузке (если ее еще нет в базе данных), а затем последующие запросы используют версию базы данных.

@Entity
public class Page extends Model {

    @Id
    public Long navigationId;

    // etc ...
}

Первоначальная загрузка и последующий доступ к запросу работают нормально, и я вижу страницу в монго:

> db.Page.find({_id:20000})
{ "_id" : NumberLong(20000), "className" : "models.Page" etc }

Однако, если я перезапущу игру! или внести изменения в код, которые приводят к повторной инициализации Morphia (в журналах появляется MorphiaPlugin-1.2.4> initialized), я получаю следующую трассировку стека:

Caused by: java.lang.RuntimeException: java.lang.RuntimeException: com.google.code.morphia.mapping.MappingException: Error setting value from converter (LongConverter) for models.Page.navigationId to 20000
    at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:487)
    at com.google.code.morphia.mapping.Mapper.fromDBObject(Mapper.java:267)
    at com.google.code.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:66)
    at com.google.code.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:53)
    at com.google.code.morphia.query.MorphiaIterator.next(MorphiaIterator.java:48)
    at com.google.code.morphia.query.QueryImpl.asList(QueryImpl.java:255)
    at play.modules.morphia.Model$MorphiaQuery.asList(Model.java:1067)
    at models.Page.findAll(Page.java)
    at plugins.PageConfigLoadPlugin.loadPersistedPages(PageConfigLoadPlugin.java:62)
    at plugins.PageConfigLoadPlugin.onApplicationStart(PageConfigLoadPlugin.java:51)
    at play.plugins.PluginCollection.onApplicationStart(PluginCollection.java:425)
    at play.Play.start(Play.java:495)
    ... 3 more
Caused by: java.lang.RuntimeException: com.google.code.morphia.mapping.MappingException: Error setting value from converter (LongConverter) for models.Page.navigationId to 20000
    at com.google.code.morphia.mapping.ValueMapper.fromDBObject(ValueMapper.java:27)
    at com.google.code.morphia.mapping.Mapper.readMappedField(Mapper.java:501)
    at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:484)
    ... 14 more
Caused by: com.google.code.morphia.mapping.MappingException: Error setting value from converter (LongConverter) for models.Page.navigationId to 20000
    at com.google.code.morphia.converters.DefaultConverters.fromDBObject(DefaultConverters.java:133)
    at com.google.code.morphia.mapping.ValueMapper.fromDBObject(ValueMapper.java:25)
    ... 16 more

Если я удалю коллекцию из mongodb с помощью командной строки, я снова смогу успешно загрузить и запросить объект Page из моей игры! веб приложение

> db.Page.drop()
true

Как я уже упоминал, этот класс находится в модуле. Эта проблема возникает только в одном приложении, от которого зависит модуль. Другое демонстрационное приложение работает нормально.

какие-либо предложения?


person Toby    schedule 10.01.2012    source источник


Ответы (1)


Есть ли в зависимом модуле другое альтернативное объявление классов Page или Model?

Из верхней части трассировки стека («com.google.code.morphia.mapping.MappingException: ошибка установки значения из преобразователя (LongConverter) для models.Page.navigationId в 20000») похоже, что существует несоответствие типов между способ хранения и извлечения числового значения. Например, в Java нередко сохраняется что-то как Double, а затем по ошибке пытаются получить его как Integer или Long. Итак, можете ли вы убедиться, что объявление navigationId в зависимом модуле совпадает с показанным здесь? Они должны использовать одно и то же определение, но, возможно, есть альтернатива.

Еще одна вещь, которую нужно проверить, это то, что ваш код помещает Long в ваш DBObject, а не с плавающей запятой. Например, если вы вставляете его через оболочку, вам нужно будет использовать одну из оболочек, например.

db.Page.save({_id:NumberLong(20000)});

В противном случае это также вызовет несоответствие при его извлечении; по умолчанию числа в JavaScript являются двойными.

person Chris Westin    schedule 10.01.2012
comment
Спасибо за ваши предложения Крис. В пути к классам нет других объявлений страницы. Я вполне уверен, что значение сохраняется правильно, потому что его получение в командной строке возвращает _id : NumberLong(20000), а объявление в классе — Long navigationId. - person Toby; 12.01.2012