在域类方法

时间:2017-08-24 07:13:19

标签: grails gorm

根据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。

2 个答案:

答案 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()