48 votes

Comment puis-je obtenir un bean Spring dans un filtre de servlet?

J'ai défini un javax.servlet.Filter et j'ai une classe Java avec des annotations Spring.

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

@Configuration
public class SocialConfig {

    // ...

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

Je veux obtenir le bean UsersConnectionRepository dans mon Filter , j'ai donc essayé ce qui suit :

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

Mais il renvoie toujours null . Comment puis-je obtenir un haricot de printemps dans un Filter ?

36voto

Tomasz Nurkiewicz Points 140462

Essayer:

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

usersConnectionRepository est un nom/id de votre bean dans le contexte de l'application. Ou encore mieux :

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

Jetez également un œil à GenericFilterBean et ses sous-classes.

22voto

Elad Tabak Points 366

Spring a une utilité juste pour ça.

Dans votre code de filtre, remplacez la méthode init comme ceci :

 public void init(FilterConfig cfg) { 
    super.init(cfg);
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}

Ensuite, vous n'avez qu'à @Injecter vos haricots dans ce filtre, de la même manière que n'importe quel autre haricot que vous injecteriez.

 @Inject
private UsersConnectionRepository repository;

1voto

Kelvin Phan Points 19

étend cette classe ci-dessous.

 abstract public class SpringServletFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //must provide autowiring support to inject SpringBean
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, filterConfig.getServletContext());      
    }

    @Override
    public void destroy() { }

    abstract public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X