0

在 Grails 2.2.2 应用程序中,我有一个看起来像这样的一对多关系:

家长:

class Client {
    ...
    String name
    static hasMany = [modelFieldInstances: ModelFieldInstance]
    ...
}

孩子:

class ModelFieldInstance {
    ...
    String name
    String value
    static belongsTo = [client: Client]
    ...
}

我正在尝试创建一个数据导入器,以便用户可以导入包含其客户记录的电子表格或 csv。为此,我检查了 grails 脚手架在标准脚手架控制器Client的方法中创建新实例时使用的参数。save

问题是当我尝试Client用我的导入器创建和保存一个新实例时,子ModelFieldInstances 被保存而没有它们对父级的引用Client(尽管 sClient和s 都被保留了ModelFieldInstance)。

在我的进口商中,我正在做这样的数据绑定:

Client client = new Client()
client.modelFieldInstances = ListUtils.lazyList(new ArrayList(), {new ModelFieldInstance()} as org.apache.commons.collections.Factory)
client.properties = properties
...
client.save()

我认为 Grails 脚手架控制器的工作方式与我的导入器的工作方式之间唯一真正的区别在于,在我的导入器中,我最初将modelFieldInstances集合设置为LazyList. 但是,在我添加LazyList分配之前,数据绑定出现了如下错误:

Invalid property 'modelFieldInstances[31]' of bean class [com.myapp.Client]: Illegal attempt to get property 'modelFieldInstances' threw exception; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'modelFieldInstances[31]' of bean class [com.myapp.Client]: Cannot get element with index 31 from Set of size 0, accessed using property path 'modelFieldInstances[31]'**

所以,我想问题是,当我可以看到它在给定属性映射的脚手架控制器中工作时,为什么数据绑定在我的数据导入器中不起作用。

4

1 回答 1

0

作为一种变通方法,我实现了一种方法,该方法遍历modelFieldInstances集合中的所有项目并手动将父级 ( client) 分配给每个项目。这似乎工作正常,但是我仍然不确定为什么 grails 数据绑定不为我做这件事。我想知道是不是有什么魔法发生在GrailsParameterMap...

于 2013-10-07T07:52:44.303 回答