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