Pergunta

Eu estou olhando para acessar um feijão no meu fechamento destruir na Bootstrap.groovy do meu projeto grails. Todas as ideias sobre como conseguir isso?

I parecem não ter acesso a servletContext ...?

Foi útil?

Solução

Você pode obter uma referência à applicationContext de todos os lugares (incluindo o fechamento destruir de BootStrap) usando esse pedaço de código:

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

Obter uma referência a um feijão é tão fácil como ctx.beanName.

Aqui está uma pequena classe util (escrito em Java) que pode simplificar esta tarefa:

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);
    }

}

e um exemplo:

def bean = SpringUtil.getBean("beanName")

Cheers, Sigi

Outras dicas

Eu sei que eu sou toda tarde aqui e todos, mas desde que eu encontrei esta via Google ...

Sua classe BootStrap injetado com Spring beans por nome, assim como todos os serviços e controladores e outras coisas. Se você quer um feijão, apenas def-lo pelo nome e ele vai aparecer. Caso contrário, basta def grailsApplication e ir para grailsApplication.mainContext.getBean etc.

Hmm, eu não posso encontrar qualquer exemplos de qualquer pessoa, mesmo usando o fechamento bloco destruir em Bootstrap. De docs:

    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 

Como um palpite, eu teria que dizer que o servletContext já foi destruída antes que o {{}} destruir fechamento de Bootstrap é executado, de modo que o feijão que você está tentando acessar já se foi. Alguém pode confirmar?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top