2016-08-05 27 views
2

Ich kann WebApplicationContext nicht innerhalb von ServletContextListener abrufen. Ich suchte nach Lösung, aber keiner von ihnen arbeitet für mich. Ich würde mich freuen, wenn jemand helfen kann. Danke im Voraus.WebApplicationContextUtils.getWebApplicationContext (ServletContext) gibt NULL von ServletContextListener zurück

Im Folgenden sind Code snippets- Meine AppConfig Klasse:

package in.andonsystem.config; 

import org.springframework.context.MessageSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.support.ResourceBundleMessageSource; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 
import org.springframework.web.servlet.view.JstlView; 

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = {"in.andonsystem"}) 
public class AppConfig extends WebMvcConfigurerAdapter{ 

    @Bean 
    public ViewResolver viewResolver(){ 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Bean 
    public MessageSource messageSource(){ 
     ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
     messageSource.setBasename("messages");  
     return messageSource; 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/static/**").addResourceLocations("/static/"); 
    } 
} 

Meine AppInitializer Klasse.

package in.andonsystem.config; 

import javax.servlet.ServletRegistration; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.ContextLoaderListener; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 

public class Appinitializer implements WebApplicationInitializer{ 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.register(AppConfig.class); 
     rootContext.setServletContext(servletContext); 

     // Manage the lifecycle of the root application context 
     servletContext.addListener(new ContextLoaderListener(rootContext)); 
     rootContext.refresh(); 

     // Register and map the dispatcher servlet 
     ServletRegistration.Dynamic dispatcher = 
       servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 

    } 
} 

Meine ContextListener Klasse:

package in.andonsystem.config; 

import com.mysql.jdbc.AbandonedConnectionCleanupThread; 
import java.sql.Driver; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.Enumeration; 
import java.util.logging.Logger; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.WebApplicationContextUtils; 

@WebListener 
public class ContextListener implements ServletContextListener{ 

    private Logger logger = Logger.getLogger("ContextListener"); 


    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     logger.info("contextInitialized()"); 

     WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); 
     System.out.println("Is rootContext null:" + (rootContext == null)); 

    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 

    } 

} 

stdout Ausgabe kommt immer wahr. Was fehlt mir?

Antwort

1

Schließlich kam die Lösung auf. Das Problem war, dass ServletContextListener vor ContextLoaderListener geladen wurde und daher ein zurückgegebener WebApplicationContext null war, weil ContextLoaderListener vor ServletContextListener geladen werden musste, um den RootContext zu erhalten.

Ich entfernte @ WebListener-Annotation von meinem ContextListener und fügte diesen Listener programmatisch in der onStartup-Methode von AppInitializer nach dem Hinzufügen von ContextLoaderListener hinzu.

Nun meine ContextListener ohne @WebListener Anmerkung ist:

public class ContextListener implements ServletContextListener{ 

    private Logger logger = Logger.getLogger("ContextListener"); 


    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     logger.info("contextInitialized()"); 

     WebApplicationContext rootContext = 
       WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); 
     System.out.println("Is rootContext null:" + (rootContext == null)); 

    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     logger.info("contextDestroyed()"); 
    } 

} 

und AppInitializer ist:

public class Appinitializer implements WebApplicationInitializer{ 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.register(AppConfig.class); 
     rootContext.setServletContext(servletContext); 

     // Manage the lifecycle of the root application context 
     servletContext.addListener(new ContextLoaderListener(rootContext)); 
     //ContextListener must be added after ContextLoaderListener 
     servletContext.addListener(ContextListener.class); 


     // Register and map the dispatcher servlet 
     ServletRegistration.Dynamic dispatcher = 
       servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 

    } 
} 
0

Sieht grundsätzlich richtig, aber ich denke, Sie sollten die folgenden 2 Zeilen aus Ihrer initializer Klasse entfernen:

rootContext.setServletContext(servletContext); 

und

rootContext.refresh();