2011-11-03 3 views
10

GrailsのサービスクラスはSpring管理のシングルトンであることを認識しています。そのようなラクダのケースでは、serviceClassNameでローカルなdefを宣言するだけで、別のサービスクラスを参照できるということも知っています。どのような私を驚かせたことは、私はそうGrailsサービスクラスクロスリファレンス

class FirstService { 

    def secondService 
... 
} 

class SecondService { 

    def firstService 
... 
} 

のように一緒に参照サービスクラスを横断するように見えることができないということでした皆のための真これは、どこか...セクションのI混乱をやりましたか?

答えて

14

循環参照がある場合、Grailsは注入できません。実際には、FactoryBean is not fully initialized yetの行に沿って例外が発生しているはずです。 GrailsよりSpringともっと関係があるので、これについてのJIRAの問題は修正されないと言いました(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'を意味しましたか? –

+0

いいえ、 '' def firstService'''がアプリケーションコンテキストに注入されるので、initializeがsecondService上で実行されると、 '' grailsApplication.mainContext''からfirstServiceを取得できます' – Todd