복붙노트

[SPRING] Spring과 DelegatingFilterProxy에 @Autowired

SPRING

Spring과 DelegatingFilterProxy에 @Autowired

나는 스프링 빈을 필터에 주입하려고 시도하지만 작동하게 만들 수는 없다.

주입 된 bean은 항상 "null"입니다. 필자는 컨트롤러와 HandlerInterceptor에서이 동일한 bean을 autowiring하는 데 성공하므로 올바르게 주석 처리됩니다.

필터 클래스는 나머지 컨트롤러의 기본 패키지 아래에 있습니다.

이것은 내 web.xml의 관련 부분입니다.

  <filter>
    <filter-name>CheckSession</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CheckSession</filter-name>
    <url-pattern>/panel/*</url-pattern>
  </filter-mapping>

이것은 필터의 코드입니다.

@Component 
public class CheckSession extends OncePerRequestFilter implements Filter {

    @Autowired private Usuario usuario;

    @Override
    protected void doFilterInternal(
        HttpServletRequest request,
        HttpServletResponse response, FilterChain chain)
    throws ServletException, IOException {

        //  always null
        System.out.println("autowired " + usuario);
        chain.doFilter(request,  response);
    }
}

필터는 모든 요청에서 트리거됩니다.

이것들은 "Usuario"빈에있는 주석들이다.

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Usuario implements java.io.Serializable { ... }

내가 뭘 놓치고 있니? 감사!

해결법

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

    1.CheckSession bean의 이름을 명시 적으로 정의하고 도움이되는지 확인하십시오.

    CheckSession bean의 이름을 명시 적으로 정의하고 도움이되는지 확인하십시오.

    @Component("CheckSession")
    public class CheckSession extends OncePerRequestFilter implements Filter {
        @Autowired private Usuario usuario;
    
        @Override
        protected void doFilterInternal(HttpServletRequest request,
                HttpServletResponse response, FilterChain chain)
                throws ServletException, IOException {
    
            //  always null
            System.out.println("autowired " + usuario);
            chain.doFilter(request,  response);
        }
    }
    

    핵심 부분은 다음과 같습니다. @Component ( "CheckSession")

    그리고 길을 더 일찍 처리하기가 더 쉽도록하기 위해 나는 이름을 붙이고 이름을 "checkSession"으로 바꿉니다 (첫 번째 문자는 소문자로 만드십시오).

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

    2.스프링 3.2.6에서 작동 :

    스프링 3.2.6에서 작동 :

    첫 번째 : 구성 요소 이름 지정, 2 가지 옵션 - 하나만 수행

    옵션 A : 주석 - 구성 요소 검사가 사용 가능하다고 가정합니다.

    @Component("checkSession")
    public class CheckSession extends OncePerRequestFilter {
    
    @Autowired 
    Usuario usuario;
    
    @Override
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) throws ServletException, IOException {
    
        // not null
        System.out.println("autowired " + usuario);
        chain.doFilter(request,  response);
        }
    }
    

    옵션 B : applicationContext.xml을 통한 와이어 빈

    <bean id="checkSession" class="com.example.filter.CheckSession"></bean>
    

    둘째 : Spring DelegatingFilterProxy를 연결합니다.

    <filter>
      <filter-name>checkSession</filter-name>
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    
    <filter-mapping>
      <filter-name>checkSession</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    주 : bean 이름은 filter-name으로 참조됩니다.

  3. from https://stackoverflow.com/questions/9690754/spring-and-autowired-on-a-delegatingfilterproxy by cc-by-sa and MIT license