根据 Grails,应该可以在域类中使用服务。但是当我运行以下简单示例时,grails run-app 失败并出现 NullPointerException:“无法在空对象上调用方法 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 失败,而不是自动将服务注入(inject)域类?
解决方案:
对于所有想知道使用“静态映射 = { autowire true }”的解决方案是什么(参见 erichelgeson 的答案)的人。但是测试这两种解决方案,我发现“静态映射......”在 Grails 3.3.0 和 3.2.9 中有效,因此在 application.yml 中全局设置它只适用于 Grails 3.2.9,但不适用于 Grails 3.3.0你。
请您参考如下方法:
出于性能原因,最新版本的 Grails(3.2.9+)默认禁用域类的 Autowiring 。您可以重新启用它:
每个域:
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 节




