2012-01-10 61 views
0

我有以下類,這是持續到一個使用嗎啡在戲劇mongodb!應用。這個類駐留在一個模塊中,這是另一個遊戲的依賴!應用。查找所有播放嗎啡後重新初始化失敗

它的配置是從一個文件中讀取的,並在初始加載時保存到數據庫中(如果它尚未在數據庫中),然後後續請求使用db版本。

@Entity 
public class Page extends Model { 

    @Id 
    public Long navigationId; 

    // etc ... 
} 

初始加載和後續查詢獲得好的工作,我可以在蒙戈看到頁面:

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

但是如果我重新開始玩!或修改代碼導致嗎啡被重新初始化 (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中刪除集合,我可以再次加載和查詢頁面在我的遊戲中成功! web應用程序

> db.Page.drop() 
true 

正如我所提到的,這個類是在一個模塊中。此問題只發生在模塊依賴於的一個應用程序中。其他演示應用程序正常工作。

有什麼建議?

回答

2

從屬模塊是否有另一個頁面或模型類的替代聲明?

從堆棧跟蹤的頂部(「com.google.code.morphia.mapping.MappingException:將轉換器(LongConverter)的值設置爲models.Page.navigationId的值設置爲20000」),它看起來像有一個在數字值被存儲和檢索的方式之間鍵入 之間的不匹配。例如,在Java中, 將某些東西存儲爲Double並不常見,然後錯誤地嘗試使用 將其作爲Integer或Long讀取。那麼,您能否驗證從屬模塊中的navigationId的 聲明與您在此顯示的 相同?他們應該分享這個定義,但它可能有 替代。

另一件要檢查的事情是,你的代碼將一個Long放入你的DBObject而不是一個浮點數。例如,如果你通過shell插入它, 你需要使用一個包裝器,例如,

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

否則,當您檢索它時,這也會導致不匹配;默認情況下, JavaScript中的數字是雙打。

+0

感謝您的建議克里斯。在classpath中沒有其他頁面聲明。我相當確信值正在被正確保存,因爲在命令行上檢索它返回「_id」:NumberLong(20000),並且該類中的聲明是long navigationId。 – Toby 2012-01-11 22:53:30