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

标签 spring spring-mvc grails grails-3.1

Grails版本:3.1.2

每当创建域对象(VersionedDomainClass)的新实例时,我都会调用一个版本控制服务(VersionService)。我希望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在创建Service Bean之前执行此操作?

最佳答案

除了使用构造函数,您还可以使用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)
    }
}

关于spring - 我可以在域对象构造函数中调用grails服务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204857/

相关文章:

java - SQL 列索引超出范围 spring-security

grails - 在 Grails 中对域实例进行版本控制以供批准

grails - grails 3缓存-ehcache配置

java - spring security在哪里取值来替换通配符?

java - 在单个 Spring 应用程序中增加数据库模式

Spring Rest Controller 继承

grails - grails:findallbyidinlist方法

css - 无法在 Spring MVC 4 (eclipse) 中加载本地 css

java - 使用 spring-boot-2.2.1 删除 HATEOAS 链接中的 _embedded

java - 保留和释放数据