根据Grails,应该可以在域类中使用服务。但是当我运行以下简单示例时,grails run-app失败并出现NullPointerException:"无法在null对象上调用方法test()"
要重现,请使用以下代码:
BootStrap.groovy中:
class BootStrap {
def init = { servletContext ->
new Test().test()
}
def destroy = {
}
}
服务:
@Transactional
class TestService {
def test() {
}
}
和域类:
class Test {
def testService
def test() {
testService.test()
}
}
Grails 3.2.9和3.3.0会发生这种情况。这是Grails错误还是GORM失败,而不是自动将服务注入域类?
解: 对于所有想知道解决方案是什么(参见erichelgeson的回答)使用"静态映射= {autowire true}"。但是测试这两个解决方案,我发现"静态映射..."在Grails 3.3.0和3.2.9中工作,因此在application.yml中全局设置只适用于Grails 3.2.9,但不适用于Grails 3.3.0。
答案 0 :(得分:2)
出于性能原因,Grails(3.2.9+)的最新版本默认在域类上禁用了自动装配。您可以重新启用它:
每个域名:
static mapping = {
autowire true
}
或全局在application.yml / groovy
grails.gorm.autowire = true
查看更多@ http://gorm.grails.org/6.1.x/hibernate/manual/index.html 第1.2.9节
答案 1 :(得分:0)
您可以根据之前的建议重新启用自动装配,但对您的整个应用程序有性能影响。如果这是一种常见的情况,那可能是值得的。
如果这种情况很少见,您也可以在域类中访问服务:
Holders.applicationContext.serviceName.methodName()