记录 springboot中ContextLoader.getCurrentWebApplicationContext()为null 排查

原由:

  1. 想要通过如下代码获取项目路径

    1
    2
    3
    WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
    ServletContext servletContext = webApplicationContext.getServletContext();
    String savePath = servletContext.getRealPath("/static/image");
  2. 结果获取的webApplicationContext为null,从而导致接口抛出nullException的错误。

排查:

  1. debug进入ContextLoader.getCurrentWebApplicationContext()中发现WebApplicationContext返回为null【图1】。
    图1
  2. debug进入SpringBootServletInitializer.onStartup方法,查看WebApplicationContext的初始化情况;结果并未执行onStartup方法。
  3. 考虑到以往的ssm项目的经验ContextLoaderListener一般是配置在web.xml中的对web容器有依赖。所以使用远程tomcat重新debug一遍,确实进入了SpringBootServletInitializer.onStartup方法中,但是ContextLoader.getCurrentWebApplicationContext()的值仍然为null。
  4. 重新查看onStartup方法时发现,springboot的onStartup方法初始化ContextLoaderListener时采用的时ContextLoader的构造方法【图2】,而并没有调用ContextLoader.ContextLoader.initWebApplicationContext方式,所以仍然获取不到。要是仍然要使用这种方式的话,需要重新SpringBootServletInitializer中的onStartup方法。
    图2
  5. 后来采用了String savePath = req.getSession().getServletContext().getRealPath(“/static/image”);的方式获取了路径信息。