GrailsDataBinder限制?

时间:2014-09-01 12:08:51

标签: grails data-binding

我试图使用grails数据绑定将一些表单参数映射到我的模型中,但我想也许在映射嵌入式集合方面存在一些限制。

例如,如果我提交一些像这样的参数,那么映射就可以了:

//this works
productLineItems[0].product.id='123'
productLineItems[0].name='product name'
productLineItems[0].description='some description'
...

但是,如果我的productLineItems集合嵌入了域类的关联中,我试图保存,那么GrailsDataBinder就会被org.codehaus.groovy.grails.exceptions.InvalidPropertyException炸毁:

//this blows up
sale.productLineItems[0].product.id='123'
sale.productLineItems[0].name='product name'
sale.productLineItems[0].description='some description'
...

我真的很想避免手动进行映射。有办法解决这个问题吗?

我使用的是Grails 2.3.7。

1 个答案:

答案 0 :(得分:1)

请参阅https://github.com/jeffbrown/embeddedcollectionbinding处的示例应用。这是一个Grails 2.3.7应用程序,它演示了一种管理绑定嵌套集合的方法。以下测试使用您描述的相同嵌套参数结构,测试通过:

// test/unit/demo/DemoControllerSpec.groovy
package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(DemoController)
@Mock([Entry, Sale, ProductLineItem, Product])
class DemoControllerSpec extends Specification {

    void "test something"() {
        given:
        def product = new Product(code: 'initial product code').save()

        when:
        params.'sale.description' = 'some sale'
        params.'sale.productLineItems[0].product.id' = product.id
        params.'sale.productLineItems[0].name' = 'updated product name'
        params.'sale.productLineItems[0].description' = 'updated product description'
        def model = controller.createEntry()
        def entry = model.entry

        then:
        entry
        entry.sale
        entry.sale.description == 'some sale'
        entry.sale.productLineItems[0] instanceof ProductLineItem
        entry.sale.productLineItems[0].name == 'updated product name'
        entry.sale.productLineItems[0].description == 'updated product description'
        entry.sale.productLineItems[0].product
        entry.sale.productLineItems[0].product.code == 'initial product code'
    }
}

如果您的模型中有其他一些细节使这一点复杂化,如果您能提供更多详细信息,我将很乐意为您提供帮助。

我希望有所帮助。