在Spring中使用ContextStartedEvent将过滤器添加到servletcontext

时间:2018-08-04 15:37:38

标签: java spring spring-mvc servlet-filters spring-filter

我想在servletFilter初始化后添加一个Applicationcontext。原因是过滤器依赖于userdetailsS​​ervice bean,而userdetailsS​​ervice bean又是autowired到其他依赖bean。问题是当我构建应用程序时,我可以看到onApplicationEvent被调用,但是当我尝试从浏览器运行该应用程序时,过滤器没有被调用。

如何实现将过滤器添加到servlet上下文。

如果我将其添加到实现onStartup(ApplicationContext ctx)的类的webApplicationInitializer方法中,则会使用相同的过滤器,因为Bean尚未初始化,应用程序将抛出未定义的依赖项错误。

@Component
public class AppContextStartedListener implements ApplicationListener<ContextStartedEvent> {

@Autowired
private MyAppFilter myAppFilter;

    @Override
    public void onApplicationEvent(ContextStartedEvent event) {
        System.out.println("Context started"); // this never happens
        ServletContext = event.getServletContext // demo code to fetch Servlet 
                         Context
        FilterRegistere.Dynamic appFilter = ServletContext.addFilter("",myAppFilter)
appFilter.setInitParameter("init","initit")

    }
}

1 个答案:

答案 0 :(得分:0)

您可以在Configuration类中将过滤器声明为Bean:

@Configuration
public class MyConfig {

  @Bean
  public MyAppFilter myAppFilter() {
     return new MyAppFilter();
  }
}

这样,只有在应用上下文初始化后,您的过滤器才会发生。