2012-01-10 3 views
0

私は、モルフォを使用してモンゴブに残っている次のクラスを持っています!応用。クラスは、別のプレイの依存関係であるモジュールにあります!応用。再生モルフィアが再初期化された後、findAllが失敗する

その構成はファイルから読み込まれ、初期ロード時に(dbにまだ存在しない場合)dbに保存され、その後の要求ではdbバージョンが使用されます。

@Entity 
public class Page extends Model { 

    @Id 
    public Long navigationId; 

    // etc ... 
} 

初期ロードとその後の照会アクセスOK動作し、私はモンゴでページを見ることができます:

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

しかし、私はプレー再起動する場合は!または再初期化されてMorphiaになり、コードの変更を行う (MorphiaPlugin-1.2.4> initializedがログに表示されます)私は、次のスタックトレースを取得:私は、コマンドラインを使用してのMongoDBのコレクションをドロップすると

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 

は、私は再び読み込むことができますし、クエリをページは私の演劇から正常に従います! Webアプリケーション

> db.Page.drop() 
true 

前述したように、このクラスはモジュール内にあります。この問題は、1つのアプリケーションでモジュールが依存関係になっている場合にのみ発生します。他のデモアプリケーションも正常に動作します。

提案がありますか?

答えて

2

依存モジュールにPageクラスまたは モデルクラスの別の代替宣言がありますか?

スタックトレースの先頭(「com.google.code.morphia.mapping.MappingException:models.Page.navigationIdのコンバーター(LongConverter)の設定値が20000に設定されていません」)から、 の間に型の不一致があり、数値の格納および取得方法です。たとえば、Javaの は、何かをDoubleとして格納してから、間違って を整数または長整数として取得することは珍しくありません。したがって、従属モジュールの のnavigationId宣言がここに示した と同じであることを確認できますか?彼らは定義を共有する必要がありますが、その可能性があるのは です。

もう1つ点は、あなたのコードがfloatではなく DBObjectにLongを入れていることです。たとえば、シェルで挿入する場合は、 のように、ラッパーの1つを使用する必要があります。

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

そうしないと、検索時に不一致が発生します。デフォルトでは JavaScriptの数値は2倍です。

+0

Chrisさんの提案に感謝します。クラスパスには他の宣言はありません。私はかなり値が保存されていることを確信しています。コマンドラインでそれを取得すると "_id"が返されるからです:NumberLong(20000)、クラス内の宣言はLong navigationIdです。 – Toby