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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!