Grails服务使用另一个服务的方法

5

我正在构建一个Grails应用程序,在尝试实例化另一个服务的不同服务时遇到了一个问题。这两个服务都使用了彼此定义的方法,例如:

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无法完成的事情吗?还是有人能提供任何建议?

谢谢

5个回答

4

我过去也遇到过类似的问题,但只有当两个服务都是事务性的时候才会出现。如果能够将它们中的至少一个变为非事务性,则应该可以正常工作。如果这不可能,则备选方案是进行一种“延迟绑定”。

class FooService {
  def grailsApplication
  private getBarService() {
    grailsApplication.mainContext.barService
  }

  public methodThatUsesBarService() {
    barService.doSomething()
  }
}

这将在使用barService的位置查找应用程序上下文,而不是创建FooService的位置。


3

一个服务可以被另一个服务调用,但不能在初始化时调用。如果您想实现这一点,应该采取以下方式。

class fooService{
    def barService

    def getIt(){
        ...
    }

    def anotherFooMethod(){

        barService.doIt();
    }
}

class barService{
    def fooService


    def doIt(){
        ...
    }

    def anotherBarMethod(){

        fooService.getIt();
    }
}

2
所有这些答案都非常出色,展示了如何通过框架来处理问题。尽管如此,当我遇到这个问题时,我意识到如果我必须让服务相互调用并引起冲突,那么我的计划和架构一定存在缺陷。我没有寻找解决方法,而是采取了一个稍微简单和直接的方法——重构。我将有问题的方法从服务类中移动到另一个服务类中。虽然需要进行一些重构、重新思考和复制/粘贴技能,但我认为应用程序变得更好了。
我并不是说这比其他答案更好。我是说,在这个项目中,这次重构是更好、更快、更简单的解决方案。我强烈推荐这样做。
更新: 我们的最终策略是将所有“实用”服务函数重构为baseService类,然后让所有需要实用服务的其他服务扩展baseService。新的策略是避免将服务注入到其他服务中,除非出现某些情况不允许我们遵循这种继承模式。这将给我们一个更清洁的代码库,并减少了要跟踪的注入路径。此外,它还消除了这种错误的出现。

1

这不是有效的代码,所以很难知道实际发生了什么。 doIt()getIt() 的调用是否在构造函数中?如果是这样,请更改服务以实现org.springframework.beans.factory.InitializingBean并在afterPropertiesSet方法中进行调用。


0

您可以使用以下方法处理循环引用 -

我们称其为firstSerivce和secondService。

对于secondService类的代码更改

protected def firstService 
def grailsApplication 

def initialize() {
    this.firstService = grailsApplication.mainContext.firstService 
}

Bootstrap.groovy中的代码更改

def secondService

def init = { servletContext ->

    secondService.initialize()
...
..

slotHistoryService是什么? - Charles Wood
1
@CharlesWood,我修改了代码以纠正错误。感谢您指出这个问题。 - saurabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接