2

統合テストと Grails スキャフォールディングを使用して、mongoDB データベースへのデータ書き込みに問題があります。「リスト」タイプのページからドメイン インスタンスを選択しようとすると、「[ドメイン名] id が null で見つかりません」というエラーが表示されます。

Grails url [controller]/[action]/[id] が原因だと確信しています。この ID は文字列であり、Grails クエリの ObjectId に変換する必要があります。

指定したドメインに影響を与えるように、またはさらに良いことに、すべてのドメインに一度に影響を与えるようにこれを行う方法はありますか?

アプリを作成しているときに、アクション メソッド内から ObjectId に変換できると思いますが、足場を機能させるか、グローバル ソリューションを提供したいと考えています。

4

4 に答える 4

0

show()メソッドのget(params.id)呼び出しは、params.id文字列をObjectIdオブジェクトに変換しないため、ドメインインスタンスはnullになり、次のコードでエラーメッセージを含むアクションを一覧表示できます。

if (!exampleInstance) {
    flash.message = message(code: 'default.not.found.message', args: [message(code: 'example.label', default: 'Example'), params.id])
    redirect(action: "list")
    return
}

可能な解決策:

  1. 「grailsinstall-template」コマンドを実行すると、src / templates /scaffolding/ディレクトリのscaffoldingテンプレートを変更できます。これで、すべてのドメインクラスのカスタマイズされたコントローラー、ビュー、テストを生成する準備ができた新しいスキャフォールドができました。

  2. より簡単な解決策は、idプロパティをObjectIdではなくStringとして定義することです。文字列IDはobjectId.toString()と等しくなります。この場合、スキャフォールドは機能します。

于 2012-12-17T03:44:47.837 に答える
0

ドメイン クラスでは、ID タイプを ObjectId として保持し、それぞれのすべてのコントローラーに対して scaffold = true を保持します。

ドメインクラスで:

ObjectId id

それぞれのコントローラーで:

static scaffold = true

Mongo からすべての既存のコレクションをクリアする

mongo-plugin を正しく構成していることを考えると、Grails-Mongo アプリを起動して実行するにはこれで十分だと思います。

于 2013-10-04T17:20:46.320 に答える