我试图使用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。
答案 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'
}
}
如果您的模型中有其他一些细节使这一点复杂化,如果您能提供更多详细信息,我将很乐意为您提供帮助。
我希望有所帮助。