Как мога да използвам вградени GORM класове в Grails?

Следвайки 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

Някаква идея какво правя грешно?


person blerontin    schedule 09.04.2013    source източник
comment
Опитайте се да генерирате скелето с помощта на 'generate-all grailscompositiontest.ScafPerson' и погледнете в генерирания код, за да видите какво не е наред.   -  person Benoit Wickramarachi    schedule 09.04.2013


Отговори (2)


Открих, че документацията на grails казва да се поставят дефиниции на вградени класове или в същия изходен файл като класа на домейна, или да се постави в src/groovy. Поставих Address.groovy в src/groovy и генерирах потребителския интерфейс за моя клас Family, който има вграден обект. Генерираната страница за създаване вече се показва правилно, като адресните полета са включени в страницата Family. Все пак трябваше да променя името и полетата за стойност на всяко поле на формуляр в генерирания _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

person Nathan Ward    schedule 23.07.2014

Онзи ден се сблъсках със същия проблем. Вярвам, че може да има грешка в шаблоните, използвани от функционалността на скелето. Можете или да актуализирате шаблона, или ако не искате да се занимавате с шаблоните, стартирайте 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

person user553180    schedule 09.04.2013
comment
Благодаря за помощта. Изгледът за създаване се изобразява сега, но наборите от полета homeAddress/workAddress вече съдържат задължително поле за идентификатор и версия. Когато попълня всички полета и публикувам формуляра, сървърът връща грешка: Property [homeAddress] of class [class grailscompositiontest.ScafPerson] cannot be null Property [workAddress] of class [class grailscompositiontest.ScafPerson] cannot be null - person blerontin; 10.04.2013