2011-11-03 16 views
10

Me doy cuenta de que las clases de servicio de Grails son Singletons administrados por Spring. También sé que puede hacer referencia a una clase de servicio de otra simplemente declarando una def local con el nombre de clase de servicio en el caso de camello. Lo que me sorprendió fue que me parece que no puede cruzar las clases de servicio de referencia en conjunto como talGrails clase de servicio cross ref

class FirstService { 

    def secondService 
... 
} 

class SecondService { 

    def firstService 
... 
} 

es esto cierto para todo el mundo, o en qué me equivoco en alguna parte de la sección ...?

Respuesta

14

Grails no se puede inyectar cuando hay referencias circulares. En realidad, debería recibir una excepción según las líneas FactoryBean is not fully initialized yet. Existe un problema JIRA al respecto, donde afirmaron que no solucionarán esto, ya que se trata más de Spring que de Grails (http://jira.grails.org/browse/GRAILS-5080)

Sin embargo, hay una solución alternativa que se cita en JIRA y puedo verificar trabajar con Grails 2.0.RC1. En SecondService, hágalo protected def firstService y agregue def grailsApplication debajo de eso y luego agregue el método def initialize() { this.firstService = grailsApplication.mainContext.firstService }. Por último, en BootStrap.groovy, agregue def firstService y luego en el cierre init, agregue secondService.initialize(). No es una solución bonita, pero esto hará que todo esté conectado de la manera que usted lo desee.

+1

gracias por confirmar que no estaba loco :) – dbrin

+0

Todd, ¿quiso decir 'def secondService' en Bootstrap? –

+0

No, porque el '' 'def firstService''' hará que se inyecte en el contexto de la aplicación, por lo que cuando se inicialice en secondService, podrá recuperar firstService de' '' grailsApplication.mainContext'' ' – Todd

Cuestiones relacionadas