2013-08-28 58 views
7

我正在用maven創建一個基本的web應用程序,然後導入到Eclipse 4.2中。我將Tomcat 7設置爲服務器。我正在嘗試使用mongodb爲web應用程序配置spring數據。WebApplicationInitializer container.addServlet()返回null

我下面基於代碼的配置方法在這裏找到: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。所以這一個只返回null。現在開始修復404,可能以某種方式搞砸了控制器。

+0

不太確定,類似的設置對我來說乾淨利落。因此,基本上你會在'dispatcher.setLoadOnStartup()'行右邊得到一個空指針異常,考慮到前一行給出了一個空調度器? –

+0

這是正確的。訪問調度員的下一行是拋出NPE。我在想這可能與servlet-api有關。我沒有在POM中設置依賴項,我只是從tomcat lib目錄中將該jar添加到我的構建路徑中。 – MattG

+0

嗯,我有完全相同的問題,我沒有任何'web.xml'文件,試圖做到純註釋。 – Jagger

回答

8

根據ServletContext JavaDoc如果具有指定名稱的servlet已註冊,addServlet()方法將返回null。

0

@Ravi Rao - 你完全正確。我正在努力在tomcat上運行我的應用程序,並準確地在dispatcher.setLoadOnStartup()中獲取了NPE。

但是,當我閱讀你提供的答案時,我意識到有另一個應用程序在同一個tomcat上運行,與調度程序servlet的名稱相同。

我剛剛重命名我的調度程序servlet,它的工作令人驚訝。 剛剛提到了解決此問題的確切步驟。如果有人覺得有用