2017-02-23 91 views
1

使用Grails 3.2.3/3.2.6,我有一個問題,即Resources.groovy中配置的某些bean未注入到此文件中定義的服務中。 在現實生活中,這些配置服務之一是在測試環境中由測試郵件服務交換的郵件,另一個是執行程序服務以確保異步過程在測試模式下同步完成。該電子郵件是一個異步過程,它使用其他服務。Resources.groovy中的Grails 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

問題是您的theService bean未經過自動佈線。有多種方式可以實現這一點。你可以使用Spring註釋或者你可以在resources.groovy中做這樣的事情:

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