如何在Grails中使用嵌入式GORM类?

ble*_*tin 4 grails scaffolding grails-orm grails-domain-class

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
}
Run Code Online (Sandbox Code Playgroud)

控制器只使用脚手架:

package grailscompositiontest

class ScafPersonController {
    static scaffold = true
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,只要我浏览到"创建"视图就会触发服务器错误:

URI:     /GrailsCompositionTest/scafPerson/create
Class:   java.lang.NullPointerException
Message: Cannot get property 'id' on null object
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

use*_*180 5

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

要更新模板:

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

并改为

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

要修复生成的视图:

  1. grails> generate-all grailscompositiontest.ScafPerson
  2. 打开views/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,因此您将执行两次