4

Wicketを使ったSpringプロジェクトがあります。@SpringBeanアノテーションを使用して、Wicketコンポーネントにサービスを正常に挿入できます。

次に、Springアプリケーションコンテキストにアクセスします。したがって、他のサービスと同様に、ApplicationContext型のメンバー変数を宣言し、@SpringBeanで注釈を付けました。

@SpringBeanを使用してアプリケーションを注入しようとしています

public class MyPanel extends Panel {

    @SpringBean
    private ApplicationContext applicationContext;

    ...
}

ただし、実行時に、これによりエラーが発生します

bean of type [org.springframework.context.ApplicationContext] not found

ApplicationContextをWicketコンポーネントに挿入することはできませんか?もしそうなら、ApplicationContextにアクセスするための適切な方法は何でしょうか?

4

2 に答える 2

6

ApplicationContextは、アプリケーションクラスでアクセス可能である必要があります。

ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);

アプリケーションクラスにgetApplicationContextメソッドを作成します。

public class MyApplication extends WebApplication {

    public ApplicationContext getAppCtx() {
        return WebApplicationContextUtils.getWebApplicationContext(servletContext);
    }

}

アプリケーションオブジェクトには、任意の改札コンポーネントからアクセスできます。

public class MyPanel extends Panel {

    public MyPanel(String id) {
        ...
        ApplicationContext appCtx = ((MyApplication) getApplication()).getAppCtx();
        ...
    } 
}   
于 2012-03-22T13:41:20.297 に答える
3

ApplicationContext は、実際には Bean ではないため、Bean として注入することはできません。

Spring はApplicationContextAwareインターフェースを提供して、Spring コンテキストにアクセスする簡単な方法をアプリケーションに提供します。

public class MyContentProvider extends Panel implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext ctx) {
         applicationContext=ctx;
    }

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

Spring エンジンは、Bean をインスタンス化するときに、インターフェースを検出し、setter にアクセスします。

ウィケット コンポーネントで、このプロバイダーを挿入します。

public class MyPanel extends Panel {

    @SpringBean
    private MyContentProvider contextProvider;

    ...
}

そしてそれを使用します:

contextProvider.getApplicationContext().getBean("foo");
于 2012-03-22T13:48:20.927 に答える