Могу ли я вызвать службу Grails в конструкторе объекта домена?

Версия Grails: 3.1.2

У меня есть служба управления версиями (VersionService), которую я хотел бы вызывать всякий раз, когда я создаю новый экземпляр объекта домена (VersionedDomainClass). Я хотел бы, чтобы VersionedDomainClass обрабатывал вызов службы, но когда я пытаюсь это сделать:

class VersionedDomainClass {

    transient def versionService

    short businessVersion

    VersionedDomainClass () {
         this.businessVersion = versionService.getNextVersion(this.class)
    }

}

конструктор вызывается во время запуска, и в этот момент versionService по-прежнему имеет значение null, поэтому я получаю NPE:

Caused by: java.lang.NullPointerException: Cannot invoke method getNextVersion() on null object

Мне не нужен экземпляр VersionedDomainClass при запуске; похоже, что Spring пытается создать свой собственный класс предметной области, возможно? Есть ли способ предотвратить Spring от этого до тех пор, пока не будут созданы сервисные компоненты?


person David Yarbrough    schedule 24.03.2016    source источник


Ответы (1)


Вместо использования конструктора вы можете использовать beforeInsert() для инициализации businessVersion:

class VersionedDomainClass {

    transient def versionService

    short businessVersion

    /*
     * I get called only once;
     * right before I'm saved in the db for the first time.
     */
    def beforeInsert() {
        businessVersion = versionService.getNextVersion(this.class)
    }
}
person Emmanuel Rosa    schedule 24.03.2016