2013-04-09 40 views
4

GORM docs我试着用下面的领域类使用Grails 2.2.1:如何在Grails中使用嵌入式GORM类?

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 

任何想法,我做错了什么?

+1

尝试使用“产生,所有grailscompositiontest.ScafPerson”产生的脚手架和调查生成的代码,看看有什么是错的。 – 2013-04-09 14:05:42

回答

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),其具有嵌入的地址对象。我正在使用grails 2.3.11。

保存操作现在与正确填充嵌入对象的字段。在我的情况下,这意味着FamilyRegistration.address正确填充。

下面是从Grails的参考文献的相关信息...

“嵌入式组件类通常是相同的源文件所属的类或在src/Groovy的它自己的文件中声明,你可以把下的grails-app /域的组件类,但如果你这样做,Grails将自动创建一个专用的表吧。把这个类在src/Groovy是通常是最好的选择,因为你就可以分享跨多个域类的组成部分。”

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

5

那天我遇到了同样的问题。我相信在脚手架功能使用的模板中可能存在一个错误。您可以更新模板,或者如果您不想使用模板,运行生成所有随着Benoit提到然后修复生成的视图。

要更新模板:

  1. 的Grails>安装的模板
  2. 打开src /模板/脚手架/ renderEditor.template
  3. 找到下面的行:
 
    sb << ' value="${' << domainInstance << '.' << property.name << '}"' 

并更改为

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

要修正所生成的视图:

  1. 的grails>生成-所有grailscompositiontest.ScafPerson
  2. 打开的视图/ scafPerson/_form.gsp
 
    <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 /招聘人数

+0

感谢您的帮助。现在呈现“创建”视图,但homeAddress/workAddress字段集现在包含强制“Id”和“Version”字段。当我填写所有领域和发布形式服务器返回一个错误: '属性[是homeAddress]类[类grailscompositiontest.ScafPerson]不能null' '地产[招聘人数]类[类grailscompositiontest.ScafPerson]不能null' – blerontin 2013-04-10 06:44:29