Grails: Accesso ai fagioli di primavera nella chiusura Destory del codice di bootstrap?

StackOverflow https://stackoverflow.com/questions/574807

  •  05-09-2019
  •  | 
  •  

Domanda

Sto cercando di accedere a un fagiolo nel mio chiusura distruggere nel Bootstrap.groovy del mio progetto Grails. Tutte le idee su come raggiungere questo obiettivo?

mi sembra di avere accesso a ServletContext ...?

È stato utile?

Soluzione

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

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

Come un riferimento ad un fagiolo è 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")

Saluti, Sigi

Altri suggerimenti

So che sono tutti in ritardo qui e tutti, ma da quando ho trovato questo tramite Google ...

Il tuo classe di bootstrap viene iniettato con i fagioli di primavera per nome, proprio come tutti i servizi ei controller e roba. Se si desidera un fagiolo, basta def per nome e si metterà a vedere. In caso contrario, basta DEF grailsApplication e andare a grailsApplication.mainContext.getBean etc.

Hmm, non riesco a trovare alcun esempio di chiunque, anche con la chiusura distruggere blocco 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 tentando di accedere è andato già. Qualcuno può confermare?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top