我可以在域对象构造函数中调用grails服务吗?

时间:2016-03-24 16:10:21

标签: spring spring-mvc grails grails-3.1

Grails版本:3.1.2

我有一个版本控制服务(VersionService),每当我创建域对象的新实例(VersionedDomainClass)时,我都想调用它。我希望VersionedDomainClass能够处理调用服务,但是当我尝试这样做时:

class VersionedDomainClass {

    transient def versionService

    short businessVersion

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

}

构造函数在启动时被调用,此时versionService仍为null,因此我得到了一个N​​PE:

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

我不需要在启动时实例化任何VersionedDomainClass;看起来Spring似乎试图创建它自己的域类的意义,也许?有没有办法阻止Spring在创建服务bean之前这样做?

1 个答案:

答案 0 :(得分: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)
    }
}