如何将对象列表正确绑定到Grails命令中?

如何将对象列表正确绑定到Grails命令中?,grails,groovy,command-objects,Grails,Groovy,Command Objects,我试图弄清楚如何将JSON请求中的嵌套对象反序列化并验证为Grails2.1.1命令对象 目前我的控制器中有一个命令对象,它有一些基本属性,然后是域对象列表 protected static class CustomCommand { String name String description List<DomainObject> objs } 我看到命令对象是用空数组创建的知道如何将JSON正文中的子对象反序列化到命令对象中,然后验证它们吗? 以前,我通

我试图弄清楚如何将JSON请求中的嵌套对象反序列化并验证为Grails2.1.1命令对象

目前我的控制器中有一个命令对象,它有一些基本属性,然后是域对象列表

protected static class CustomCommand {
    String name
    String description
    List<DomainObject> objs
}
我看到命令对象是用空数组创建的知道如何将JSON正文中的子对象反序列化到命令对象中,然后验证它们吗?


以前,我通过从参数映射手动创建一个对象并直接验证来解决这个问题,但这感觉像是一个没有利用Grails提供的所有功能的解决方法。

我们也遇到了一个类似的问题,即将post数据绑定到命令中的列表。我们的解决方法是为集合元素定义一个默认值:

class MyCommand {    
    List<MyClass> items= [].withLazyDefault {
        new MyClass()
    }
}
我使用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

我从未在Grails2.1.1下实现过,但显然这是在

将请求正文绑定到命令对象 如果向接受命令对象的控制器操作发出请求,并且该请求包含一个主体,则该主体将被解析并用于与命令对象进行数据绑定。这简化了请求包含可绑定到命令对象的JSON或XML正文(例如)的用例。有关详细信息,请参见命令对象文档


你最近有没有偶然发现?@dmahapatro,谢谢,这很有用,TLDR听起来好像不是现成的。你想花点时间把这个线程总结成一个答案,这样我就可以给你投票了吗?是的,Groovy确实忽略了泛型的类型,因为它都是在运行时进行的,这是一个编译时检查,为了清楚起见,我把它包括在问题中。不幸的是,你的工作不适合我。您使用的是什么版本的Grails?我在Grails 2.1.3下进行了一次尝试,仍然没有成功。您是否尝试过使用
新的CustomCommand(request.JSON)
?(我更新了我的答案)有趣的是,区别可能在于我使用的是默认的数据绑定,即命令类——我的控制器方法的参数类型。
def test() {
     println new MyCommand(request.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]]