我建立一个Grails应用程序和所遇到的问题试图instatiate服务时,在不同的服务。 无论是服务的使用在其他如中定义的方法。
class fooService{
def barService
barService.doIt()
def getIt(){
...
}
}
class barService{
def fooService
fooService.getIt()
def doIt(){
...
}
}
当我运行应用程序,并转到被使用的方法,它带来了这个错误;
Error creating bean with name 'fooService':
org.springframework.beans.factory.FactoryBeanNotInitializedException: FactoryBean is
not fully initialized yet
这是一件无法用Grails做呢? 或者,任何人都可以提供任何意见?
谢谢
我已经在过去也有类似的问题,但只有当这两种服务是事务性的。 如果有可能,使他们中的至少一种非事务那么它应该工作原样。 如果这是不可能的,那么回退是做一种“后期绑定”
class FooService {
def grailsApplication
private getBarService() {
grailsApplication.mainContext.barService
}
public methodThatUsesBarService() {
barService.doSomething()
}
}
这将查找barService
在应用方面,在需要用到它,而不是在该点的点FooService
被创建。
服务可以通过其他服务来调用,但在初始化时不可能的。 如果要实现这一点,方式应该是这样。
class fooService{
def barService
def getIt(){
...
}
def anotherFooMethod(){
barService.doIt();
}
}
class barService{
def fooService
def doIt(){
...
}
def anotherBarMethod(){
fooService.getIt();
}
}
所有这些问题的答案是优秀的,并展示如何通过框架处理问题。 虽然,当我有这个问题,我意识到必须有我的计划和架构的缺陷,如果我绝对必须有服务呼叫对方,引起冲突。 相反,找到的工作,围绕我参加了一个稍微不那么复杂和两岸向前的做法 - 我重组。 我把从服务类违规的方法到另一个服务类。 它采取了一些重构,重新思考和复制/粘贴技巧,但我认为应用是它更好。
我并不是说这是比其他答案更好。 我说,这个时候,这个项目的重构是一个更好,更快,更复杂的解决方案。 我强烈推荐它。
更新我们最后的策略是重构所有的“效用”服务功能集成到一个baseService类,然后有需要的公用服务扩展baseService所有其他服务。 这项新政策是为了避免注射服务到其他服务,除非一些情况出现,不允许我们遵循这一遗传模式。 这将为我们提供一个更干净的代码基础,减少注射遵循的意大利面条踪迹。 另外,它消除了这种错误的出现。
这不是有效的代码,所以很难知道到底发生了什么上。 是doIt()
和getIt()
在构造函数的调用? 如果是这样,改变服务来实现org.springframework.beans.factory.InitializingBean
做在调用afterPropertiesSet
方法。
您可以使用以下处理循环引用 -
让我们把它叫做firstSerivce和secondService。
对于secondService类代码更改
protected def firstService
def grailsApplication
def initialize() {
this.firstService = grailsApplication.mainContext.firstService
}
BootStrap.groovy中的代码更改
def secondService
def init = { servletContext ->
secondService.initialize()
...
..