使用Grails 3.2.3 / 3.2.6,我遇到一个问题,即Resources.groovy中配置的某些bean没有注入到此文件中定义的服务中。 在现实生活中,这些配置的服务之一是由测试环境中的测试邮件服务交换的邮件,另一个是执行器服务,以确保在测试模式下同步完成异步处理。该电子邮件是异步过程,它使用其他服务。
我有一个控制器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()
避免了这个问题,但我想避免使用全局变量......
为什么第一个服务没有注入第二个服务?
答案 0 :(得分:2)
问题是你的theService
bean没有接受自动接线。实现这一目标的方法不止一种。你可以使用Spring注释,或者你可以在resources.groovy
中执行类似的操作:
beans = {
theService(OneService) { bean ->
bean.autowire = 'byName'
}
theOtherService(AlternateSecondService)
}