【问题标题】:findAll fails after play morphia is reinitialised重新初始化 play morphia 后 findAll 失败
【发布时间】:2012-01-10 04:28:51
【问题描述】:

我有以下类在剧中使用 morphia 持久化到 mongodb 中!应用。该类驻留在一个模块中,该模块是另一个游戏的依赖项!应用。

它的配置是从文件中读取的,并在初始加载时保存到数据库中(如果它还没有在数据库中),然后后续请求使用数据库版本。

@Entity
public class Page extends Model {

    @Id
    public Long navigationId;

    // etc ...
}

初始加载和后续查询访问正常,我可以在 mongo 中看到页面:

> 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 中删除集合,我可以再次从我的游戏中成功加载和查询页面对象!网络应用

> db.Page.drop()
true

正如我提到的,这个类在一个模块中。此问题仅发生在该模块所依赖的一个应用程序中。另一个演示应用程序工作正常。

有什么建议吗?

【问题讨论】:

    标签: java mongodb playframework morphia


    【解决方案1】:

    依赖模块是否有另一个页面的替代声明或 模型类?

    从堆栈跟踪的顶部,(“com.google.code.morphia.mapping.MappingException:错误将models.Page.navigationId的转换器(LongConverter)的值设置为20000”),看起来有一个类型之间的不匹配 存储和检索数值的方式。例如,在 Java 中, 将某些东西存储为 Double 然后错误地尝试的情况并不少见 将其检索为整数或长整数。那么,您能否验证 依赖模块中的navigationId声明与那个相同 你在这里展示过吗?他们应该分享定义,但可能有 替代品。

    要检查的另一件事是您的代码是否在您的 DBObject 而不是浮点数。例如,如果您通过外壳插入它, 您需要使用其中一种包装器,例如

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

    否则,这也会导致你检索时不匹配;默认情况下 JavaScript 中的数字是双精度数。

    【讨论】:

    • 感谢您的建议,克里斯。类路径中没有其他 Page 声明。我非常有信心正确保存该值,因为在命令行上检索它会返回“_id”:NumberLong(20000) 并且类中的声明是 Long navigationId。
    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2012-11-17
    • 2017-12-10
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多