2011-11-03 54 views
10

我意識到Grails服務類是Spring管理的單例。我也知道你可以通過在camel case中聲明一個帶有serviceClassName的本地def來引用另一個服務類。讓我吃驚的是,我似乎無法跨越的參考服務類在一起,像這樣Grails服務類交叉編號

class FirstService { 

    def secondService 
... 
} 

class SecondService { 

    def firstService 
... 
} 

這是真正的每個人,或在...節之前我弄亂的地方?

回答

14

當有循環引用時,Grails無法注入。實際上,您應該沿着FactoryBean is not fully initialized yet的方向獲得例外。有一個關於這個JIRA的問題,他們表示他們不會解決這個問題,因爲它比Spring更像是使用Spring而不是Grails(http://jira.grails.org/browse/GRAILS-5080

但是,有一個解決方法可以在JIRA中引用,我可以驗證與Grails 2.0.RC1合作。在SecondService中,使其成爲protected def firstService並在其下方添加def grailsApplication,然後添加方法def initialize() { this.firstService = grailsApplication.mainContext.firstService }。最後,在BootStrap.groovy中,添加def firstService然後在init關閉,添加secondService.initialize()。這不是一個漂亮的解決方案,但是這會讓一切按照你想要的方式進行。

+1

謝謝你確認我沒有瘋狂:) – dbrin

+0

託德,你的意思是'def secondService'在Bootstrap上? –

+0

不,因爲'first firstService''會導致它被注入到應用程序上下文中,所以當在secondService上運行initialize時,它將能夠從''''grailsApplication.mainContext''中檢索firstService ' – Todd