9

我正在使用 maven 创建一个基本的 Web 应用程序,然后导入到 Eclipse 4.2。我将 Tomcat 7 设置为服务器。我正在尝试使用 mongodb 为 Web 应用程序配置 spring 数据。

我正在遵循此处找到的基于代码的配置方法:WebApplicationInitializer

当我在服务器上运行项目时,在我创建的 WebApplicationInitializer 类中出现空指针异常。行:container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 正在返回 null。

我到底错过了什么?我对使用注释从头开始创建网络应用程序有点陌生。

这是有问题的课程:

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。 所以这个只返回null。现在开始修复 404,可能以某种方式搞砸了控制器。

4

2 回答 2

13

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

于 2015-11-07T11:37:09.107 回答
1

@Ravi Rao - 你完全正确。我正在努力在 tomcat 上运行我的应用程序,并且在 dispatcher.setLoadOnStartup() 处获得了 NPE。

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

我刚刚重命名了我的调度程序 servlet,它的效果非常好。刚刚提到了解决此问题的确切步骤。万一有人觉得有用

于 2017-01-07T19:06:07.413 回答