2015-07-11 79 views
0

我正在創建基於REST的Web應用程序,其中AngularJS作爲前端和基於REST的後端(使用Spring 4)。我下面這裏找到基於代碼的配置方法:WebApplicationInitializerWebApplicationInitializer container.addFilter()返回null

當我在服務器上運行的項目,我在該行獲得一個空值:

FilterRegistration.Dynamic filter = container.addFilter("prerender", seoFilter); 

我缺少什麼?我從頭開始使用註釋創建web應用程序有點新。

這裏是有問題的類:

public class MyWebAppInitializer implements WebApplicationInitializer { 

@Override 
public void onStartup(ServletContext container) throws ServletException { 

XmlWebApplicationContext appContext = new XmlWebApplicationContext(); 
appContext.setConfigLocation("classpath:MyContext.xml"); 

ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(appContext)); 
dispatcher.setLoadOnStartup(1); 
dispatcher.addMapping("/api/*"); 

com.github.greengerong.PreRenderSEOFilter seoFilter = new com.github.greengerong.PreRenderSEOFilter(); 
FilterRegistration.Dynamic filter = container.addFilter("prerender", seoFilter); 
filter.setInitParameter("prerenderToken", "123456789123456789"); 
filter.addMappingForUrlPatterns(null , true, "/*"); 

ServletRegistration.Dynamic initSysConfiguration 
     = container.addServlet("initSysConfiguration", new InitSystemConfigurations()); 
initSysConfiguration.setLoadOnStartup(1); 
initSysConfiguration.addMapping("/InitSystemConfigurations"); 

} 

此行是給我空

com.github.greengerong.PreRenderSEOFilter seoFilter = new com.github.greengerong.PreRenderSEOFilter(); 

我想這一點,但同樣的結果

FilterRegistration.Dynamic filter1 = container.addFilter("prerender", com.github.greengerong.PreRenderSEOFilter.class); 
+0

可以共享異常堆棧跟蹤 – Mudassar

+0

是否已經閱讀了[Javadoc中(http://docs.oracle.com/ javae/7/api/javax/servlet/ServletContext.html#addFilter-java.lang.String-javax.servlet.Filter-)並排除了所有'addFilter()'方法返回null的情況? –

回答

1

當方法addFilter回報null這意味着已經有a filter registered在名義上。

返回:
可用於進一步配置定的過濾器,或null如果ServletContext已經包含了一個完整的FilterRegistration與過濾器的FilterRegistration對象的給定filterName或者相同的過濾器實例有已經在同一個容器中註冊與這種或者其他ServletContext

確保您沒有web.ml其中已經註冊該過濾器。

另一個提示,而不是實施WebApplicationInitializer自己擴展AbstractDispatcherServletInitializer並實現所需的方法。

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer { 

    @Override 
    public void onStartup(ServletContext container) throws ServletException { 
     super.onStartup(container); 

     com.github.greengerong.PreRenderSEOFilter seoFilter = new com.github.greengerong.PreRenderSEOFilter(); 
     FilterRegistration.Dynamic filter = container.addFilter("prerender", seoFilter); 
     filter.setInitParameter("prerenderToken", "123456789123456789"); 
     filter.addMappingForUrlPatterns(null , true, "/*"); 

     ServletRegistration.Dynamic initSysConfiguration 
       = container.addServlet("initSysConfiguration", new InitSystemConfigurations()); 
     initSysConfiguration.setLoadOnStartup(1); 
     initSysConfiguration.addMapping("/InitSystemConfigurations"); 

    } 

    protected WebApplicationContext createServletApplicationContext() { 
     XmlWebApplicationContext appContext = new XmlWebApplicationContext(); 
     appContext.setConfigLocation("classpath:MyContext.xml"); 
     return appContext; 
    } 

    protected String[] getServletMappings() { 
     return new String[] {"/api/*"}; 
    } 

} 
1

我解決了它的運行Maven命令mvn clean,我不知道有些事情是錯的地方,並給了我奇怪的行爲。我不敢肯定我從這個問題:(學習

感謝您的幫助。