resources.groovy中的Grails bean未注入服务中

时间:2017-02-23 13:28:22

标签: grails dependency-injection

使用Grails 3.2.3 / 3.2.6,我遇到一个问题,即Resources.groovy中配置的某些bean没有注入到此文件中定义的服务中。 在现实生活中,这些配置的服务之一是由测试环境中的测试邮件服务交换的邮件,另一个是执行器服务,以确保在测试模式下同步完成异步处理。该电子邮件是异步过程,它使用其他服务。

Here is a sample project

我有一个控制器OneController:

class OneController {
    def theService
    def theOtherService

    def index() {
        render status:200, text: theService.getDataFromOtherService()
    }

    def direct() {
        render status:200, text: theOtherService.klet()
    }
}

resources.groovy文件定义了def

的映射
beans = {
    theService(OneService)
    theOtherService(AlternateSecondService)
}

服务非常简单:

class OneService {
    def theOtherService

    def getDataFromOtherService() {
        theOtherService.klet()
    }
}

class AlternateSecondService {

    def klet() {
        "Mariette"
    }
}

现在,如果我访问http://localhost:8080/one/index,我会在theOtherService.klet()上获得空指针异常,因为theOtherService为空。

如果我访问http://localhost:8080/one/direct,控制器确实正确地注入了bean并且工作正常。

我目前通过使用Holders.getGrailsApplication().mainContext.theOtherService.klet()避免了这个问题,但我想避免使用全局变量......

为什么第一个服务没有注入第二个服务?

1 个答案:

答案 0 :(得分:2)

问题是你的theService bean没有接受自动接线。实现这一目标的方法不止一种。你可以使用Spring注释,或者你可以在resources.groovy中执行类似的操作:

beans = {
    theService(OneService) { bean ->
        bean.autowire = 'byName'
    }
    theOtherService(AlternateSecondService)
}