2011-11-03 8 views
10

Zdaję sobie sprawę, że klasy usług Grails to wiosenne pojedynki zarządzane. Wiem również, że możesz odwoływać się do jednej klasy usług od drugiej, po prostu deklarując lokalną def z serviceClassName w takim przypadku wielbłąda. Co mnie zaskoczyło to to, że nie może wydawać się przejechać klas usług odniesienia razem jak takGrails klasa usługowa przekrój

class FirstService { 

    def secondService 
... 
} 

class SecondService { 

    def firstService 
... 
} 

Czy to prawda dla wszystkich, albo ja bałagan gdzieś w sekcji ...?

Odpowiedz

14

Grails nie może wstrzyknąć, gdy istnieją odwołania kołowe. W rzeczywistości powinieneś otrzymać wyjątek zgodny z FactoryBean is not fully initialized yet. Jest na to problem z JIRA, w którym stwierdzili, że nie naprawią tego, ponieważ ma to więcej wspólnego z Spring niż Grails (http://jira.grails.org/browse/GRAILS-5080)

Istnieje jednak rozwiązanie, które jest cytowane w JIRA i mogę je zweryfikować pracować z Grails 2.0.RC1. W SecondService ustaw go na protected def firstService i dodaj poniżej def grailsApplication, a następnie dodaj metodę def initialize() { this.firstService = grailsApplication.mainContext.firstService }. Wreszcie w BootStrap.groovy dodaj def firstService, a następnie zamknij init, dodaj secondService.initialize(). Nie jest to ładne rozwiązanie, ale wszystko zostanie podłączone tak, jak chcesz.

+1

dziękuję za potwierdzenie, że nie byłem szalony :) – dbrin

+0

Todd, miałeś na myśli 'def secondService' na Bootstrap? –

+0

Nie, ponieważ '' def firstService''' spowoduje, że zostanie on wprowadzony do kontekstu aplikacji, więc gdy inicjalizacja zostanie uruchomiona na secondService, będzie mogła pobrać firstService z '' 'grailsApplication.mainContext'' ' – Todd