【问题标题】:WebApplicationInitializer container.addFilter() returns nullWebApplicationInitializer container.addFilter() 返回 null
【发布时间】:2015-07-11 10:45:30
【问题描述】:

我正在创建一个基于REST 的Web 应用程序,其中AngularJS 作为前端,基于REST 的后端(使用Spring 4)。我正在遵循此处找到的基于代码的配置方法:WebApplicationInitializer

当我在服务器上运行项目时,我在该行中得到一个空值:

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

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

这是有问题的课程:

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");

}

这一行给我null

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

我试过了,结果一样

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

【问题讨论】:

  • 能否分享异常堆栈跟踪
  • 你看过Javadoc并排除了addFilter()方法返回null的所有情况吗?

标签: java spring rest web-applications


【解决方案1】:

addFilter 方法返回null 时,这意味着该名称已经存在a filter registered

回报:
一个FilterRegistration 对象,可用于进一步配置给定的过滤器,或者null,如果此ServletContext 已经包含具有给定filterName 的过滤器的完整FilterRegistration,或者如果相同的过滤器实例已经存在在同一个容器中注册了这个或另一个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/*"};
    }

}

【讨论】:

    【解决方案2】:

    我通过运行 maven 命令mvn clean 解决了这个问题,我不知道某处出了什么问题并给了我奇怪的行为。我不确定我从这个问题中学到了什么:(

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2020-06-19
      • 2011-10-15
      • 2014-06-28
      相关资源
      最近更新 更多