【问题标题】:Grails: Cannot invoke method sendEmail() on null object when using in serviceGrails:在服务中使用时无法在空对象上调用方法 sendEmail()
【发布时间】:2014-10-08 13:28:49
【问题描述】:

我创建了一个服务NotifierService

class NotifierService {

    MailService mailService

    def sendEmail(String email) {
        mailService.sendMail {
            to email
            from "myemail@domain.com"
            subject "Subject"
            body "Some text"
        }
    }
}

然后,我尝试在 DbService 服务中的另一个方法 updateUser 中调用 sendEmail 方法

class DbService {
    NotifierService notifierService

    def updateUser(){
        //Some Logic
        //Get userObject

        def email = userObject.email

        //Send email
        try {
            notifierService.sendEmail(email)
        } catch (Exception e) {
            e.printStackTrace()
        }
    }

    //Other methods
    .
    .
    .
}

当我在BootStrap 中调用sendEmail 方法时它工作正常,但是当我在DbService 中使用它时出现以下错误

| Error java.lang.NullPointerException: Cannot invoke method sendMail() on null object
| Error     at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:77)
| Error     at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:45)
| Error     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
| Error     at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:32)
| Error     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)

我了解到NotifierService 中的mailServiceDbService 中使用时未初始化。我该如何解决?

DbService 在 grails-job 中实例化

class MyJob {
    DbService dbService = new DbService()


    static triggers = {
        // start delay: 30000 (30sec), repeat: 120000 (2*60*1000 = 2min)
        simple name:'myJobTrigger', startDelay:30000, repeatInterval: 120000, repeatCount: -1
    }

    def execute() {
        println "*******************************************************"
        println "MyJob: "+new Date()
        println "*******************************************************"

        dbService.updateUser()
    }
}

【问题讨论】:

  • DbService 是如何实例化的?
  • 我正在使用石英插件在 grails 作业中调用 DbService 方法。
  • NotifierService DbService grails 服务吗?
  • 是的。我将用DbService 的实例化方式更新问题。

标签: grails grails-2.0 grails-plugin grails-services


【解决方案1】:

好的,那就清楚了:)

如果你这样做

DbService dbService = new DbService()

那么依赖项将永远不会被 spring 填充。

您必须保留 un-initialized 以便从应用程序上下文中注入服务:

class MyJob {
  DbService dbService // or def dbService
}

【讨论】:

  • 现在我得到java.lang.NullPointerException: Cannot invoke method updateUser() on null object
  • DbService dbService = Holders.grailsApplication.mainContext.getBean 'dbService' 解决了这个问题。
  • 石英作业中的依赖关系也应该解决automagically。如果不是,那么您一定是在这里做错了什么或者没有遵循约定......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多