2016-09-30 5 views
1

Springプロジェクトでは、リスナータイプをServletContextListenerにしました。私は@Autowiredのインスタンスフィールドを使用していますが、contextInitialized(event)メソッドでautowiredインスタンス変数を使用することはできません。NullpointerExceptionがスローされます。ServletContextListenerで@Autowiredインスタンス変数を使用する方法

どのようにコンテキストの初期化後に初期化されますことを、この

+1

あなたはそれを手動で配線する必要があります。 Springは、Java EEサーバーが行うリスナーを作成しません。あなたは 'ApplicationContext'をどうやって作りますか? [this](http://stackoverflow.com/a/21914004/2071828)を見てください。 –

答えて

0

まあ、春の保証のための@Autowiredを使用することができます。

それが初期化されます後、あなたは使用してアクセスすることができます

MyClass myClass = ctx.getBean(MyClass.class); 

を言い換えれば、あなたのアプリケーションコンテキストが最終的に初期化されるBean前を初期化するために春を強制する契約を作るため@Autowiredを使用することはできません。

1

できません。 @Autowiredは、コンテキストが初期化された後でのみ機能します。

ですから、このハックを行うことができます。

public class MyListener implements ServletContextListener { 

    private MyBean myBean;  

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); 
     this.myBean = (MyBean)ctx.getBean("myBean"); 
    } 

} 

またはよりよい解決策はボリス・スパイダーにTHX次のようになります。

public class MyListener implements ServletContextListener { 

    @Autowired 
    private MyBean myBean;  

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); 
     ctx.autowireBean(this); 
    } 

} 
+1

コンテキストがあれば、 'autowireBean(this)'を呼び出すことができます... –

関連する問題