Graal: accesso ai fagioli primaverili nella chiusura destory del codice Bootstrap?


6

Sto cercando di accedere a un bean nella mia chiusura destroy nel progetto Bootstrap.groovy del mio graal. Qualche idea su come raggiungere questo obiettivo?

Mi sembra di non avere accesso a servletContext ...?

15

È possibile ottenere un un riferimento al applicationContext da tutto il mondo (tra cui la chiusura di distruggere bootstrap) utilizzando tale pezzo di codice:

def ctx = org.codehaus.groovy.grails.web.context.ServletContextHolder.servletContext.getAttribute(org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes.APPLICATION_CONTEXT); 

ottenendo un riferimento a un bean è facile come ctx.beanName.

Ecco una piccola classe util (scritto in Java) in grado di semplificare questa operazione:

import org.springframework.context.ApplicationContext; 
import org.codehaus.groovy.grails.web.context.ServletContextHolder; 
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes; 

public class SpringUtil { 

    public static ApplicationContext getCtx() { 
     return getApplicationContext(); 
    } 

    public static ApplicationContext getApplicationContext() { 
     return (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT); 
    } 

    @SuppressWarnings("unchecked") 
    public static <T> T getBean(String beanName) { 
     return (T) getApplicationContext().getBean(beanName); 
    } 

} 

ed un esempio:

def bean = SpringUtil.getBean("beanName") 

Cheers, Sigi


2

Hmm, non riesco a trovare alcun esempio di nessuno anche utilizzando la chiusura del blocco distruggere in Bootstrap. Dalla documentazione:

 
    It is not guaranteed that {{destroy}} will be called unless the 
application exits gracefully (for example by using the application 
server's shutdown command) so don't rely on it too much 

Come una supposizione, avrei dovuto dire che la ServletContext è già stato distrutto prima che il {{}} distruggere viene eseguita la chiusura di Bootstrap, in modo che fagiolo si sta cercando di accesso è già andato. Qualcuno può confermare?


6

so che' m tutti in ritardo qui e tutto ma da quando ho trovato questo via Google ...

La tua classe BootStrap ottiene io Njected with Spring beans per nome, proprio come tutti i servizi, i controller e tutto il resto. Se vuoi un bean, basta definirlo per nome e verrà visualizzato. Altrimenti, solo def grailsApplication e vai a grailsApplication.mainContext.getBean ecc.