WebApplicationInitializer中的container.addServlet()返回null。

9
我正在使用maven创建一个基本的Web应用程序,然后将其导入到Eclipse 4.2中。我已经设置了Tomcat 7作为服务器。我尝试为Web应用程序配置Spring Data与MongoDB。
我正在遵循在此找到的基于代码的配置方法:WebApplicationInitializer
当我在服务器上运行项目时,我在创建的WebApplicationInitializer类中得到了一个空指针异常。这行代码:container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 返回null。
我错过了什么?我有点新手,使用注释从头开始创建Web应用程序。
这是相关的类:
public class ATWWebAppInitializer implements WebApplicationInitializer
{
    @Override
    public void onStartup(ServletContext container) throws ServletException  
    {
      // Create the 'root' Spring application context
      AnnotationConfigWebApplicationContext rootContext = new  AnnotationConfigWebApplicationContext();
      rootContext.register(SpringMongoConfig.class);

      // Manage the lifecycle of the root application context
      container.addListener(new ContextLoaderListener(rootContext));

      // Create the dispatcher servlet's Spring application context
      AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
      dispatcherContext.register(ATWDispatcherConfig.class);

      // Register and map the dispatcher servlet
      ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/*");
    }
} 

尝试将此添加到 POM 文件中:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

没有任何改变,仍然遇到NPE错误。我在这里读到(http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html),如果已经注册了一个servlet,那么container.addServlet将返回null?Tomcat是否已经注册了一个servlet?
很抱歉浪费了大家的时间,我还有一个web.xml文件也注册了相同的servlet,所以这个servlet只是返回null。现在开始修复404错误,可能是控制器出了问题。

我不是很确定,类似的设置对我来说很干净。所以基本上你在dispatcher.setLoadOnStartup()这一行上得到了一个空指针异常,考虑到前一行给出了一个空的dispatcher? - Biju Kunjummen
正确的。接下来访问调度程序的那一行抛出了NPE。我认为这可能与servlet-api有关。我没有在POM中设置依赖项,而是从tomcat lib目录将jar添加到构建路径中。 - MattG
嗯,我遇到了完全相同的问题,而且我没有任何web.xml文件,试图纯注释方式实现。 - Jagger
我遇到了这个问题,并通过撤销我的 org.mockito / mockito-all 依赖项来解决它。 - BillFromHawaii
你应该将你的“道歉”部分发布为答案。我也遇到了同样的问题,这篇帖子帮了我很多。 - RustyTheBoyRobot
2个回答

13
根据 ServletContext JavaDoc,如果已经注册了指定名称的 servlet,则 addServlet() 方法将返回 null。

谢谢。我为此苦恼了很久。你的回答是整个互联网空间中唯一正确的答案。 - Joseph Waweru

1

@Ravi Rao - 您说得很对。我在尝试在Tomcat上运行我的应用程序时遇到了困难,确切地说是在dispatcher.setLoadOnStartup()处遇到了NPE。

但是当我阅读您提供的答案时,我意识到还有另一个应用程序在同一台Tomcat上运行,具有与该dispatcher servlet相同的名称。

我只是将我的dispatcher servlet重命名,它就奇妙地工作了。 只是提到了解决此问题的确切步骤。如果有人发现它有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接