복붙노트

[SPRING] 서블릿 필터에서 Spring 빈을 얻으려면 어떻게해야합니까?

SPRING

서블릿 필터에서 Spring 빈을 얻으려면 어떻게해야합니까?

javax.servlet.Filter를 정의했고 스프링 주석이있는 Java 클래스가 있습니다.

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

@Configuration
public class SocialConfig {

    // ...

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

    // ...
}

내 필터에 Bean UsersConnectionRepository를 가져 오려고 했으므로 다음을 시도했습니다.

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

하지만 항상 null을 반환합니다. 필터에서 Spring 빈을 얻으려면 어떻게해야합니까?

해결법

  1. ==============================

    1.시험:

    시험:

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

    usersConnectionRepository는 응용 프로그램 컨텍스트에서 Bean의 이름 / ID입니다. 또는 더 나은 :

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

    또한 GenericFilterBean과 그 하위 클래스를 살펴보십시오.

  2. ==============================

    2.세 가지 방법이 있습니다.

    세 가지 방법이 있습니다.

  3. ==============================

    3.Spring은 이것을 위해서 유용한 유틸리티를 가지고있다.

    Spring은 이것을 위해서 유용한 유틸리티를 가지고있다.

    필터 코드에서 다음과 같이 init 메소드를 재정의하십시오.

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

    그런 다음 여러분은 @ 빈을 여러분이 주입 할 빈과 같은 방식으로 그 필터에 주입합니다.

    @Inject
    private UsersConnectionRepository repository;
    
  4. ==============================

    4.이것을 클래스 아래로 확장합니다.

    이것을 클래스 아래로 확장합니다.

    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;
    }
    
  5. from https://stackoverflow.com/questions/7882042/how-can-i-get-a-spring-bean-in-a-servlet-filter by cc-by-sa and MIT license