如何在Grails中实例化一个惰性列表?

时间:2014-10-22 21:13:19

标签: grails

我正在尝试将JSON数组接受到命令对象中。该数组如下所示:

[
{prop1:'a', 'prop2:'b', prop3:'c'},
{prop1:'d', 'prop2:'e', prop3:'f'},
{prop1:'g', 'prop2:'h', prop3:'i'},
...
]

我试图通过懒惰列表接受数组

class MyCommand {
    List myList = ListUtils.lazyList([], FactoryUtils.instantiateFactory(Map))
}

但是我收到以下错误:

InstantiateFactory: The constructor must exist and be public . Stacktrace follows:
Message: InstantiateFactory: The constructor must exist and be public
    Line | Method
->>  113 | findConstructor    in org.apache.commons.collections.functors.InstantiateFactory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|     86 | <init>             in     ''
|     67 | getInstance . . .  in     ''
|    121 | instantiateFactory in org.apache.commons.collections.FactoryUtils

接受地图数组的正确语法是什么?

我通过remoteFunction发送数据,如下所示:

var params = '{"myList":' + JSON.stringify(myList) + '}';
${remoteFunction(controller: 'myController', action: 'myAction', 
    params: 'params', onSuccess: 'callback(data)')};

我应该使用不同的方法吗?

2 个答案:

答案 0 :(得分:1)

您不需要在命令对象中使用惰性列表。您可以简化代码,让内置数据绑定系统懒惰地初始化List

// grails-app/controllers/demo/DemoController.groovy
package demo

class DemoController {

    def demo(MyCommand co) {
        [command: co]
    }
}

class MyCommand {
    List<Map> data
}

您可以使用看起来像这样的JSON向该操作发送请求...

{"data": [
{prop1:'a', 'prop2:'b', prop3:'c'},
{prop1:'d', 'prop2:'e', prop3:'f'},
{prop1:'g', 'prop2:'h', prop3:'i'},
...
]}

当您这样做时,数据绑定系统将创建MyCommand的实例,它会将data属性初始化为空List,然后填充{{1}使用JSON中表示的所有List

该代码位于https://github.com/jeffbrown/listofmaps的项目中。该项目包括以下测试:

Maps

答案 1 :(得分:0)

Map是一个接口,因此您无法实例化它。您需要选择要使用的具体类型,例如HashMapLinkedHashMap