6

JSONリクエストのネストされたオブジェクトをGrails 2.1.1コマンドオブジェクトにデシリアライズして検証する方法を見つけようとしています。

現在、コントローラーにいくつかの基本的なプロパティとドメイン オブジェクトのリストを持つコマンド オブジェクトがあります。

protected static class CustomCommand {
    String name
    String description
    List<DomainObject> objs
}

そして、私の POST リクエストへの JSON 本文、

{
    name: 'test name',
    description: 'test description',
    objs: [
        {
            name: 'test sub object',
            description: 'test description'
        }
    ]
}

空の配列で作成されたコマンド オブジェクトが表示されます。JSON本体のサブオブジェクトを取得してコマンドオブジェクトに逆シリアル化し、それらを検証する方法はありますか?

以前は、パラメーター マップからオブジェクトを手動で作成し、それを直接検証することでこの問題を回避していましたが、Grails が提供するすべてを利用していない回避策のように感じます。

4

2 に答える 2

8

コマンド内で投稿データをリストにバインドする際にも、同様の問題がありました。うまくいった回避策は、コレクション要素のデフォルト値を定義することでした:

class MyCommand {    
    List<MyClass> items= [].withLazyDefault {
        new MyClass()
    }
}

その後、投稿データはリストに正しくバインドされました。その理由は、Groovy がリストのジェネリック型パラメーターを無視し、実行時にインスタンス化するオブジェクトがわからないためだと思います。

これがあなたのケースで機能するかどうかはわかりませんが、試してみる価値があるかもしれません

アップデート:

数分前にこれを使用しました:

public static class MyCommand {
    String foo
    List<Bar> bars

    public String toString() {
        return "foo: " + foo + ", bars: " + bars
    }
}

public static class Bar {
    String baz
}

コントローラーの方法:

def test() {
     println new MyCommand(request.JSON)
}

jqueryを使用してjsonを投稿しました:

$.ajax({
    type: "POST",
    url: '...',
    data: JSON.stringify({ 
        'foo': '12345', 
        bars: [
            {baz: '1'}, 
            {baz: '2'}
        ]
    }),
    contentType : 'application/json',
});

コントローラーによって出力された出力:

foo: 12345, bars: [[baz:1], [baz:2]]

だからうまくいくようです:o

于 2013-09-05T08:14:06.960 に答える
1

これは Grails 2.1.1 では動作しませんでしたが、Grails 2.3で修正されたようです。

コマンド オブジェクトへのリクエスト ボディのバインディング コマンド オブジェクトを受け入れるコントローラ アクションに対してリクエストが行われ、そのリクエストにボディが含まれている場合、ボディは解析され、コマンド オブジェクトへのデータ バインディングに使用されます。これにより、コマンド オブジェクトにバインドできる JSON または XML 本体 (たとえば) がリクエストに含まれるユース ケースが簡素化されます。詳細については、コマンド オブジェクトのドキュメントを参照してください。

于 2013-11-23T02:22:38.060 に答える