Grails: Accès à grains de printemps dans la fermeture de destory code Bootstrap?
-
05-09-2019 - |
Question
Je suis à la recherche d'accéder à un haricot dans ma détruire la fermeture dans le Bootstrap.groovy de mon projet Grails. Toutes les idées sur la façon d'y parvenir?
Il me semble avoir pas accès à ServletContext ...?
La solution
Vous pouvez obtenir une référence à la applicationContext de partout (y compris la fermeture de détruire BootStrap) en utilisant ce morceau de code:
def ctx = org.codehaus.groovy.grails.web.context.ServletContextHolder.servletContext.getAttribute(org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes.APPLICATION_CONTEXT);
Obtenir une référence à un haricot est aussi facile que ctx.beanName
.
Voici une petite classe util (écrit en Java) qui peut simplifier cette tâche:
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);
}
}
et un exemple:
def bean = SpringUtil.getBean("beanName")
Cheers, Sigi
Autres conseils
Je sais que je suis tout retard ici et tout, mais depuis que je trouve cela via Google ...
Votre classe BootStrap obtient injecté avec des haricots Spring par nom, comme tous les services et les contrôleurs et d'autres choses. Si vous voulez un haricot, juste def par son nom et il va apparaître. Sinon, def grailsApplication et aller à grailsApplication.mainContext.getBean etc.
Hmm, je ne trouve aucun exemple de quelqu'un, même avec la fermeture de bloc détruire Bootstrap. De la documentation:
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
En tant que supposition, je dois dire que le ServletContext a déjà été détruite avant la {{}} détruire la fermeture de Bootstrap est exécutée, de sorte que bean tentez d'accéder est déjà parti. Quelqu'un peut-il confirmer?