2016-08-05 221 views
2

我无法在ServletContextListener中获取WebApplicationContext。我寻找解决方案,但他们中没有人为我工作。如果有人能提供帮助,我将不胜感激。提前致谢。WebApplicationContextUtils.getWebApplicationContext(ServletContext)从ServletContextListener返回NULL

下面是代码snippets- 我的AppConfig类:

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

我AppInitializer类。

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("/"); 

    } 
} 

我ContextListener类:

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) { 

    } 

} 

标准输出输出总是成为现实。 我错过了什么?

回答

1

终于想出了解决方案。问题在于ServletContextListener在ContextLoaderListener之前加载,因此返回的WebApplicationContext为null,因为ContextLoaderListener必须在ServletContextListener之前加载才能获得rootContext。

我从ContextListener中删除@WebListener注释,并在添加ContextLoaderListener之后以编程方式将此侦听器添加到AppInitializer的onStartup方法中。

现在我不@WebListener注释ContextListener是:

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

} 

和AppInitializer是:

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

看起来基本上是正确的,但我想你应该删除您初始化类以下2行:

rootContext.setServletContext(servletContext); 

and

rootContext.refresh();