2013-04-09 45 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