Erlo

springboot中使用ContextLoaderListener.getCurrentWebApplicationContext();获取WebApplicationContext为空问题

时间:2018-03-16   阅读:3522次   来源:博客园
页面报错
点赞

WebApplicationContext applicationContext =  ContextLoaderListener.getCurrentWebApplicationContext();

在springboot 2.0.0.M7 版本中遇到使用以上代码获取 WebApplicationContext 为null的问题。

通过上网查询原因已解决,方法如下:

@Component
@Lazy(false)
public class ApplicationContextRegister implements ApplicationContextAware {
    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationContextRegister.class);
    private static ApplicationContext APPLICATION_CONTEXT;

    #zs#*
     * 设置spring上下文  *  * @param applicationContext spring上下文  * @throws BeansException
     #fzs#
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        LOGGER.debug("ApplicationContext registed-->{}", applicationContext);
        APPLICATION_CONTEXT = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return APPLICATION_CONTEXT;
    }
}

再使用:

CrawlerService crawlerService = ApplicationContextRegister.getApplicationContext().getBean(CrawlerService.class);

获取不到的原因:springboot无论以main方法还是spring-boot:run的方式执行都不会跑SpringBootServletInitializer中的onStartup导致ContextLoaderListener没有执行。

考虑到以往的经验ContextLoaderListener一般是配置在web.xml中的对web容器有依赖,所以我直接把工程打成war放到tomcat跑果然可以调用SpringBootServletInitializer中的onStartup,

但是还是不能获取ContextLoader.getCurrentWebApplicationContext(),原因是在onStartup初始化ContextLoader时使用的是构造函数,没有用ContextLoader.initWebApplicationContext方式,

所以获取不到,要用这种方式得重写SpringBootServletInitializer中的onStartup。

解决方法来自:http://www.oschina.net/question/2416168_2189114

 

评论留言

还没有评论留言,赶紧来抢楼吧~~

吐槽小黑屋()

* 这里是“吐槽小黑屋”,所有人可看,只保留当天信息。

  • Erlo吐槽

    Erlo.vip2020-09-24 03:58:25Hello、欢迎使用吐槽小黑屋,这就是个吐槽的地方。
  • 返回顶部