2016-06-16 1 views
1

@WebFilter annotation을 통해 등록 된 필터 클래스 'MyFilter'가 있습니다. doFilter()에서 나는 내 프로젝트에서 만든 MyBeanClass의 객체가 필요합니다. new 연산자를 통해이 객체를 만들고 Tomcat에서 프로젝트를 실행하면 필터가 한 번 등록되어 제대로 작동하는 것을 볼 수 있습니다. 나는 MyFilter 클래스 위 @Component 주석을 추가하여 객체를 자동으로 묶어, 다음 바람둥이에서 프로젝트를 실행하려고하면스프링 필터에 @WebFilter 및 @Component 주석 추가하기

그러나, 나는 필터가 두 번 호출됩니다 twice.The doFilter() 등록되어 있는지 확인하고 두 번째 doFilter()입니다 MyBeanClass이라는 개체는 초기화되지 않고 null입니다. 따라서 NullPointerException.

나는 봄 개까지 의존성 주입을 떠날 필요하므로 객체를 autowiring은 것은 필요하신 우려가있다 -

  1. 는 왜 두 번 등록 된 필터입니다.
  2. 왜 개체가 두 번째로 null입니까?
  3. 올바른 방법은 무엇입니까? MyFilter.java : 여기

샘플 코드입니다

@Component 
@WebFilter(filterName = "RestFilter", urlPatterns = { "/*" }) 
public class MyFilter implements Filter { 

    @Autowired 
    MyBeanClass myBeanClass; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     //this is how I know that filter is registered twice. 
     System.out.println("this is init."); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 
     if (myBeanClass.isValidRequest()) { 
      System.out.println("Let this request pass"); 
      chain.doFilter(request, response); 
     } 
     else{ 
      System.out.println("Should not let pass this request"); 
     } 
    } 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 

    } 
} 

MyBeanClass.java

@Component 
public class MyBeanClass{ 

    Boolean valid = false; 

    public boolean isValidRequest(){ 
     //some code 
    } 

    // 
    //Other piece of code 
    // 
} 

나는 스프링 프레임 워크에 새로운 오전, 최근 프로젝트에서 작업을 시작했다 봄. 내가 잘못한 것을 수정하면 나에게 정정 해주세요. 또는 이것을 수행하는 또 다른 방법이 있다면, 저를 올바른 자원으로 안내하십시오.

+1

작동하지 않습니다 ('@ WebFilter' 때문에). 스프링에 의해 등록 된 다른 인스턴스는 자동 배선 ('@ Component' 때문에)을받을 것입니다. 하나 이상의 주석을 모두 사용하십시오. –

+0

답장을 보내 주신 M. Deinum에게 감사드립니다. @WebFilter를 통해 필터를 등록 할 필요가 있습니다. 제가 작업하고있는 프로젝트에서 따라야 할 컨벤션입니다.하지만 Autowiring이 이루어지지 않을 것입니다. 둘 다 달성 할 수있는 방법이 있습니까? – raviiii1

+0

@WebFilter로 등록하지 않거나 자동 배선을 사용하지 마십시오. 그것이 봄에 관리되지 않는 스프링은 주사를하지 않을 것이므로 수동으로 직접 주입해야합니다. –

답변

-1

응용 프로그램 클래스에 @ServletComponentScan을 추가 했으므로 필터에 @Component을 사용했기 때문입니다. 둘 중 하나를 제거 할 수 있습니다. 당신이 @component를 사용하는 경우 한 번 봄에 알 수없는 인스턴스와 같은 오토 유선되지 않습니다 서블릿 컨테이너에 의해 발견되기 때문에

그런데

,의 @webfilter 그것은 두 번 등록

+0

이것은 질문에 대한 대답을 제공하지 않습니다. 충분한 [평판] (https://stackoverflow.com/help/whats-reputation)이 있으면 [모든 게시물에 주석 달기] (https://stackoverflow.com/help/privileges/comment) 할 수 있습니다. 대신, [질문자의 설명이 필요없는 답변을 제공하십시오] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do- 대신). - [리뷰에서] (리뷰/저품절 게시물/18225228) – wp78de