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

时间:2013-09-04 23:35:59

标签: grails groovy command-objects

我正在试图弄清楚如何将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提供的所有功能的解决方法。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我从来没有在Grails 2.1.1下工作,但显然这已在Grails 2.3修复,

  

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