在GORM docs之后,我尝试将以下域类与Grails 2.2.1一起使用:
package grailscompositiontest
class ScafPerson {
String name
ScafAddress homeAddress
ScafAddress workAddress
static constraints = {
name(nullable: false, blank: false)
}
static embedded = ['homeAddress', 'workAddress']
}
class ScafAddress {
String number
String code
}
控制器只使用脚手架:
package grailscompositiontest
class ScafPersonController {
static scaffold = true
}
不幸的是,这不起作用,只要我浏览到“创建”视图就会触发服务器错误:
URI: /GrailsCompositionTest/scafPerson/create
Class: java.lang.NullPointerException
Message: Cannot get property 'id' on null object
知道我做错了吗?
答案 0 :(得分:5)
前几天我遇到了同样的问题。我相信脚手架功能使用的模板可能存在错误。您可以更新模板,或者如果您不想使用模板,请运行 generate-all ,如Benoit所述,然后修复生成的视图。
更新模板:
sb << ' value="${' << domainInstance << '.' << property.name << '}"'
并改为
sb << ' value="${' << domainInstance << '?.' << property.name << '}"'
修复生成的视图:
<g:field name="id" type="number" value="${scafAddressInstance.id}" required=""/> <g:field name="version" type="number" value="${scafAddressInstance.id}" required=""/>
并改为
<g:field name="id" type="number" value="${scafAddressInstance?.id}" required=""/> <g:field name="version" type="number" value="${scafAddressInstance?.id}" required=""/>
注意,因为你有homeAddress / workAddress
,所以你会做两次答案 1 :(得分:4)
我发现grails文档说嵌入式类定义与域类相同的源文件或将其放入src / groovy。我将Address.groovy放在src / groovy中,并为我的Family类生成了UI,它有一个嵌入对象。生成的创建页面现在可以正确显示,地址字段包含在“族”页面中。但是,我仍然需要修改生成的_form.gsp中每个表单字段的名称和值字段。
例如,以下生成的代码......
<g:textField name="line1" required="" value="${addressInstance?.line1}"/>
改为......
<g:textField name="address.line1" required="" value="${familyRegistrationInstance.address?.line1}"/>
主域对象是FamilyRegistration域类(在生成的_form.jsp中称为familyRegistrationInstance),其具有嵌入的Address对象。我使用的是grails 2.3.11。
现在,保存操作可以正确填充嵌入对象的字段。在我的情况下,这意味着正确填充了FamilyRegistration.address。
这里是Grails参考文档中的相关信息......
&#34;嵌入式组件类通常在与拥有类相同的源文件中声明,或在src / groovy下的自己的文件中声明。您可以将组件类放在grails-app / domain下,但如果这样做,Grails将自动为它创建一个专用表。将类置于src / groovy下通常是最佳选择,因为您可以跨多个域类共享组件。&#34;
http://grails.org/doc/2.2.4/ref/Domain%20Classes/embedded.html