4

新しいインスタンスをパラメーターとして渡す必要がある Java メソッドを呼び出す場合、この新しいインスタンスが CDI コンテナーによって作成される可能性はどのようにあるのでしょうか?

次の例では: リスナーを非同期サーブレット コンテキストに追加しています。

@WebServlet(value = "/example", asyncSupported = true)
public class ExampleServlet extends HttpServlet {

    @Override
    protected void doPost(final HttpServletRequest req,
        final HttpServletResponse resp) throws ServletException,
        IOException {

        // ... some code

        AsyncContext aCtx = req.startAsync(req, resp);
        aCtx.addListener(**new AsyncListener()** {
             // implementation of the async listener
        });
        // ...
    }
}

したがって、この新しい AsyncListener() のインスタンス化を手動で実行する代わりに、CDI コンテナーによって作成されるようにしたいと考えています。

もちろん、すべての aync コンテキストに独自のリスナー インスタンスが必要です。それ以外の場合は、サーブレット クラスのフィールドとして @Inject を使用して AsyncListener を注入するだけです。

今のところ、これを行う方法が見つかりませんでした。誰かが共有するアイデアを持っていますか?

4

2 に答える 2

5

Instanceリスナーを注入します。リスナークラスが依存スコープにある場合、を呼び出すたびにget()新しいインスタンスが生成されます。

@Inject
private Instance<MyAsyncListener> listenerFactory;

と:

    aCtx.addListener(listenerFactory.get());

listenerFactoryここで使用されているので、変数を呼び出しました。

これをCDIプロバイダーとしてWeld1.1.5を使用するJBossAS7.1.1でテストしましたが、これは標準的な動作であると信じています。

于 2012-11-14T08:44:55.130 に答える
0

Bean のインジェクション ポイントは、Bean がインスタンス化されるときに処理されるため、残念ながら明示的にインジェクションをトリガーすることはできません。これは、CDI の今後のリリースで変更される可能性があります (そして、変更されることを願っています)。

場合によってはその制限を回避するために使用できることを私が認識している1つのアプローチは、注入先のクラスをカプセル化または派生させ、注入可能なフィールドまたは初期化メソッドを提供することです。この場合は になりますがAsyncContext、 が返すものを制御できHttpServletRequestないため、このオプションはここでは適用できません。

CDI BeanManagerを使用して何かを解決できるかもしれませんが、これには呼び出すよりもはるかに多くの労力が必要になると思いますnew

于 2012-11-14T08:35:43.513 に答える