Spring ServletConfig() 或者ServletContext 不存在解决方案

抛出的异常可能是:

ServletConfig has not been initialized

进入debug模式,可能会发现servletConfig这个变量为null
解决方案如下:

首先看看你的那个类是什么?是controller还是HttpServlet.如果继承HttpServlet并且还有@Controller,那干脆不要使用Ht
tpServlet这个东西。因为想得到ServletConfig可以通过其他的方法。例如下面:

@Controller
@RequestMapping("/index")
public class HomeIndexHandler implements ServletContextAware {
    private static final Log LOG = LogFactory.getLog(HomeIndexHandler.class);
    
    private ServletContext servletContext;

    public void setServletContext(ServletContext sc) {
        this.servletContext=sc;
        
    }

        @RequestMapping("/index")
    public ModelAndView process(HttpServletRequest req, HttpServletRequest resp) {

        ServletContext context = servletContext;
        return null; //将断点设在这里
    }

运行上面的例子发现context不为空…那么问题就解决了。还是null就继续找错误。
如果是单纯的HttpServlet, 那么看看是否重载了init(ServletConfig
config)方法。重载这个方法时要调用父类的init才行。类似于:

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);
    // your code here
 }

如果在super.init(config)处设置断点,在初始化Servlet时,Servlet容器会将这个config传入。如果没有调用这个函数,需要再看看
web.xml这个文件有没有写正确。

当然你也可以像我一样慢慢的查找:

首先是ContextListener这个最初的初始化类,然后是dispatch类, 然后是intecepter类的初始化,然后各个bean初始化,在这些类的
非初始方法中,调用getServletConfig()看看是否非null.我的错误发生在intercepter类中的preHandler()方法中的Obje
ct handler, handler中的config为NULL. 所有我跟踪断点到HomeIndexHandler
初始化过程,发现没有调用init(ServletConfig
config)但是调用了init()方法,这说明服务器完全没有把HomeIndexHandler
当作HttpServlet。而是认为是一个Bean.那么就不会设置ServletConfig。

不能用servlet单纯的设置一下@Controller就变为spring mvc了…还要许多地方需要变动。