4

按照GORM 文档,我尝试在 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

知道我做错了什么吗?

4

2 回答 2

5

前几天我遇到了同样的问题。我相信脚手架功能使用的模板中可能存在错误。您可以更新模板,或者如果您不想使用模板,请按照 Benoit 所述运行generate-all然后修复生成的视图。

要更新模板:

  1. grails> 安装模板
  2. 打开 src/templates/scaffolding/renderEditor.template
  3. 找到以下行:
    sb << ' value="${' << domainInstance << '.' << property.name << '}"'

并更改为

    sb << ' value="${' << domainInstance << '?.' << property.name << '}"'

要修复生成的视图:

  1. grails> 生成所有 grailscompositiontest.ScafPerson
  2. 打开视图/scafPerson/_form.gsp
  3. 寻找
    <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

于 2013-04-09T19:31:31.007 回答
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 参考文档的相关信息...

“嵌入式组件类通常在与所属类相同的源文件中声明,或者在 src/groovy 下它自己的文件中声明。您可以将组件类放在 grails-app/domain 下,但如果这样做,Grails 将自动创建一个专用表。将类放在 src/groovy 下通常是最好的选择,因为您可以在多个域类之间共享组件。

http://grails.org/doc/2.2.4/ref/Domain%20Classes/embedded.html

于 2014-07-23T13:24:25.513 回答