Grails:在服务中使用时,无法在null对象上调用方法sendEmail()

时间:2014-10-08 13:28:50

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

我创建了一项服务NotifierService

class NotifierService {

    MailService mailService

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

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

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
    .
    .
    .
}

我在sendEmail中调用BootStrap方法时效果很好,但在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)

我了解mailService中的NotifierServiceDbService中使用时未初始化DbService。我该如何解决?

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() } } 在grails-job

中实例化
{{1}}

1 个答案:

答案 0 :(得分:5)

好的,这很清楚:)

如果你这样做

DbService dbService = new DbService()

那么依赖关系永远不会用spring填充。

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

class MyJob {
  DbService dbService // or def dbService
}