Search code examples
javaspringservletsservlet-filters

How can I get a Spring bean in a servlet filter?


I have defined a javax.servlet.Filter and I have Java class with Spring annotations.

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;

@Configuration
public class SocialConfig {

    // ...

    @Bean
    public UsersConnectionRepository usersConnectionRepository() {
        // ...
    }
}

I want to get the bean UsersConnectionRepository in my Filter, so I tried the following:

public void init(FilterConfig filterConfig) throws ServletException {
    UsersConnectionRepository bean = (UsersConnectionRepository) filterConfig.getServletContext().getAttribute("#{connectionFactoryLocator}");
}

But it always returns null. How can I get a Spring bean in a Filter?


Solution

  • Try:

    UsersConnectionRepository bean = 
      (UsersConnectionRepository)WebApplicationContextUtils.
        getRequiredWebApplicationContext(filterConfig.getServletContext()).
        getBean("usersConnectionRepository");
    

    Where usersConnectionRepository is a name/id of your bean in the application context. Or even better:

    UsersConnectionRepository bean = WebApplicationContextUtils.
      getRequiredWebApplicationContext(filterConfig.getServletContext()).
      getBean(UsersConnectionRepository.class);
    

    Also have a look at GenericFilterBean and its subclasses.