问题 Grails服务类交叉参考


我意识到Grails服务类是Spring管理的单例。我也知道你可以通过在camel情况下使用serviceClassName声明一个本地def来引用另一个服务类。让我感到惊讶的是,我似乎无法像这样一起交叉参考服务类

 class FirstService {

   def secondService
 ...
 }

 class SecondService {

   def firstService
 ...
 }

这对每个人都是如此,还是我在......部分的某个地方搞砸了?


12493
2017-11-03 22:55


起源



答案:


当存在循环引用时,Grails无法注入。实际上你应该得到一个例外 FactoryBean is not fully initialized yet。有一个关于这个的JIRA问题,他们说他们不会解决这个问题,因为它更多的是关于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()。不是一个漂亮的解决方案,但这将使你想要它的方式连接起来。


16
2017-11-04 03:01



谢谢你确认我并不疯狂:) - dbrin
托德,你的意思是 def secondService 在Bootstrap? - Alexander Suraphel
不,因为 def firstService 将导致将其注入应用程序上下文,因此当在secondService上运行initialize时,它将能够从中检索firstService grailsApplication.mainContext - Todd


答案:


当存在循环引用时,Grails无法注入。实际上你应该得到一个例外 FactoryBean is not fully initialized yet。有一个关于这个的JIRA问题,他们说他们不会解决这个问题,因为它更多的是关于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()。不是一个漂亮的解决方案,但这将使你想要它的方式连接起来。


16
2017-11-04 03:01



谢谢你确认我并不疯狂:) - dbrin
托德,你的意思是 def secondService 在Bootstrap? - Alexander Suraphel
不,因为 def firstService 将导致将其注入应用程序上下文,因此当在secondService上运行initialize时,它将能够从中检索firstService grailsApplication.mainContext - Todd