我可以在域对象构造函数中调用 grails 服务吗?
Can I call a grails service in a domain object constructor?
Grails 版本:3.1.2
我有一个版本控制服务 (VersionService),我想在创建域对象 (VersionedDomainClass) 的新实例时调用它。我希望 VersionedDomainClass 处理服务调用,但是当我尝试这样做时:
class VersionedDomainClass {
transient def versionService
short businessVersion
VersionedDomainClass () {
this.businessVersion = versionService.getNextVersion(this.class)
}
}
构造函数在启动期间被调用,此时 versionService 仍然为空,所以我得到一个 NPE:
Caused by: java.lang.NullPointerException: Cannot invoke method getNextVersion() on null object
我不需要在启动时实例化任何 VersionedDomainClass;看起来 Spring 正在尝试创建它自己的域 class 实例?有什么方法可以防止 Spring 在创建服务 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)
}
}
Grails 版本:3.1.2
我有一个版本控制服务 (VersionService),我想在创建域对象 (VersionedDomainClass) 的新实例时调用它。我希望 VersionedDomainClass 处理服务调用,但是当我尝试这样做时:
class VersionedDomainClass {
transient def versionService
short businessVersion
VersionedDomainClass () {
this.businessVersion = versionService.getNextVersion(this.class)
}
}
构造函数在启动期间被调用,此时 versionService 仍然为空,所以我得到一个 NPE:
Caused by: java.lang.NullPointerException: Cannot invoke method getNextVersion() on null object
我不需要在启动时实例化任何 VersionedDomainClass;看起来 Spring 正在尝试创建它自己的域 class 实例?有什么方法可以防止 Spring 在创建服务 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)
}
}