web-dev-qa-db-fra.com

Comment enregistrer ServletContextListener au démarrage du printemps

Bonjour, j'essaie de réécrire mon ancien code pour utiliser Spring Boot. J'ai un auditeur public class ExecutorListener implements ServletContextListener.

Comment puis-je inscrire cet auditeur pour Spring Boot? J'ai essayé:

@SpringBootApplication
@ComponentScan
public class Application extends SpringBootServletInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new ExecutorListener());
    }

}

Mais la méthode contextInitialized n'est pas appelée.

13
bilak

Vous pouvez essayer plusieurs choses: Enregistrez explicitement ExecutorListener comme @Bean:

@Bean
public ExecutorListener executorListener() {
   return new ExecutorListener();
}

ou

Vous pouvez l'essayer en créant explicitement ServletRegistrationBean:

@Bean
public DispatcherServlet dispatcherServlet() {
    DispatcherServlet servlet=new DispatcherServlet();
    servlet.getServletContext().addListener(new ExecutorListener());
    return  servlet;
}

@Bean
public ServletRegistrationBean dispatcherServletRegistration() {
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(dispatcherServlet(), "/rest/v1/*");
    registrationBean
            .setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);


    return registrationBean;
}
16
jny

Si vous utilisez un conteneur incorporé, il y aura bientôt une troisième option si vous utilisez SpringBoot 1.3.0+ Annotez votre implémentation ServletContextListener avec @WebListener à partir de la spécification de servlet 3, puis annotez l'une de vos classes Spring @Configuration avec le nouveau @ServletComponentScan (et indiquez éventuellement quels paquets analyser les filtres, les servlets et les écouteurs).

Seulement disponible dans la version 1.3.0 pour le moment, cependant: http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/web/servlet/ServletComponentScan.html

Docs: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

15
Tom Bunting

Si vous préférez que la découverte automatique utilise uniquement des annotations, assurez-vous que ExecutorListener implémente les ServletContextInitializer et ex. annotez-le avec javax.annotation.ManagedBean. A partir de là, implémentez simplement la méthode onStartup:

@ManagedBean
public final class ExecutorListener implements ServletContextInitializer {
  ...
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
      ...
    }
}
0
buer