【问题标题】:How do you properly bind a list of objects into a Grails command?如何正确地将对象列表绑定到 Grails 命令中?
【发布时间】:2013-09-04 23:35:59
【问题描述】:

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

【问题讨论】:

  • 你最近有没有偶然发现this discussion
  • @dmahapatro,谢谢这很有用,TLDR 听起来好像不能开箱即用。您想花时间将该主题总结为答案,以便我给您投票吗?

标签: grails groovy command-objects


【解决方案1】:

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

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

【讨论】:

  • 是的,Groovy 确实忽略了泛型的类型,因为它都是在运行时进行的,并且是编译时检查,为了清楚起见,我将其包含在问题中。不幸的是,您的解决方法对我不起作用。您使用的是什么版本的 Grails?
  • 我在 Grails 2.1.3 下试了一下,还是不行。
  • 您是否尝试过使用new CustomCommand(request.JSON)? (我更新了我的答案)
  • 有趣,不同的可能是我使用的是默认数据绑定,即命令类我的控制器方法的参数类型。
【解决方案2】:

我从来没有让这个在 Grails 2.1.1 下工作,但显然这在 Grails 2.3 中得到了修复,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2015-12-12
    • 2012-03-31
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多