Pergunta

Como injetar dependências no HTTPSessionListener, usando a primavera e sem chamadas, como context.getBean("foo-bar") ?

Foi útil?

Solução

Como o Servlet 3.0 ServletContext possui um método "AddListener", em vez de adicionar seu ouvinte no seu arquivo web.xml, você pode adicionar através do código como assim:

@Component
public class MyHttpSessionListener implements javax.servlet.http.HttpSessionListener, ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (applicationContext instanceof WebApplicationContext) {
            ((WebApplicationContext) applicationContext).getServletContext().addListener(this);
        } else {
            //Either throw an exception or fail gracefully, up to you
            throw new RuntimeException("Must be inside a web application context");
        }
    }           
}

O que significa que você pode injetar normalmente no "MyHttpSessionListener" e com isso, simplesmente a presença do feijão no contexto do seu aplicativo fará com que o ouvinte seja registrado no contêiner

Outras dicas

Você pode declarar seu HttpSessionListener como um feijão no contexto da primavera e registre um proxy de delegação como um ouvinte real em web.xml, algo assim:

public class DelegationListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se) {
        ApplicationContext context = 
            WebApplicationContextUtils.getWebApplicationContext(
                se.getSession().getServletContext()
            );

        HttpSessionListener target = 
            context.getBean("myListener", HttpSessionListener.class);
        target.sessionCreated(se);
    }

    ...
}

Com a primavera 4.0, mas também funciona com 3, implementei o exemplo detalhado abaixo, ouvindo ApplicationListener<InteractiveAuthenticationSuccessEvent> e injetar o HttpSession https://stackoverflow.com/a/19795352/2213375

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