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

时间:2013-04-09 12:37:05

标签: grails gorm scaffolding grails-domain-class

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

知道我做错了吗?

2 个答案:

答案 0 :(得分:5)

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

更新模板:

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

    并改为

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

    修复生成的视图:

    1. 的grails&GT; generate-all grailscompositiontest.ScafPerson
    2. 打开views / scafPerson / _form.gsp
    3. 寻找
    4.     <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