0

プレイでモルフィアを使用してmongodbに永続化される次のクラスがあります! 応用。クラスは、別のプレイの依存関係であるモジュールに存在します! 応用。

その構成はファイルから読み取られ、初期ロード時にデータベースに永続化され (まだデータベースにない場合)、その後の要求は db バージョンを使用します。

@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

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

助言がありますか?

4

1 に答える 1

2

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

スタックトレースの先頭から( "com.google.code.morphia.mapping.MappingException:models.Page.navigationIdから20000へのコンバーター(LongConverter)からの値の設定エラー")、数値が保存および取得される方法。たとえば、Javaでは、何かをDoubleとして格納し、それを誤ってIntegerまたはLongとして取得しようとすることは珍しくありません。では、依存モジュールでのnavigationIdの宣言が、ここで示したものと同じであることを確認できますか?彼らは定義を共有する必要がありますが、別の方法がある可能性があります。

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

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

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

于 2012-01-10T20:29:44.783 に答える