2016-06-16 10 views
1

フィルタ春に@WebFilterと@Component注釈を追加する「myFilterを」私は、私は私のプロジェクトで作成したMyBeanClassのオブジェクトが必要doFilter() annotation.In @WebFilterを経て登録されています。 new演算子でこのオブジェクトを作成し、tomcatでプロジェクトを実行すると、フィルタが一度登録されて正常に動作していることがわかります。私はMyFilterクラス上@Component注釈を追加することにより、オブジェクトをAutowire、その後、Tomcatでプロジェクトを実行しようとすると私はFilterクラスを持っている

しかし、私はフィルタが2回呼び出されtwice.The doFilter()登録されていることを確認し、二度目doFilter()ですMyBeanClassというオブジェクトは初期化されておらず、nullです。したがって、NullPointerException。私は春件まで依存性注入を残しておく必要がありますので、オブジェクトをオートワイヤリングするneeded.Theの関心事である

がある -

  1. フィルタが二回登録されているのはなぜ。
  2. なぜオブジェクトが2度目にヌルになるのですか?
  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 
    // 
} 

私はSpringフレームワークに新しいですし、最近でプロジェクトに取り組んで開始しました春。私が何か悪いことをしているなら、私を修正してください。または、これを行う別の方法がある場合は、適切なリソースに私を指示します。

+1

を動作しません。 ( '@ WebFilter'のため)。スプリングで登録された別のインスタンスがあります( '@ Component'のため)。いずれか一方を使用しますが、両方の注釈を使用しないでください。 –

+0

クイック返信のためのM. Deinumに感謝します。 @WebFilterを介してフィルタを登録する必要があります。私が取り組んでいるプロジェクトではコンベンションに従っていますが、オートワイヤリングは達成されません。両方を達成する方法はありますか? – 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-c​​an- i-do-代わりに)。 - [レビューの投稿](/レビュー/低品質の投稿/ 18225228) – wp78de

関連する問題