4

在调用必须将新实例作为参数传递的 Java 方法时,这个新实例怎么可能由 CDI 容器创建?

在以下示例中:我正在向异步 servlet 上下文添加一个侦听器:

@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
        });
        // ...
    }
}

因此,我希望它由 CDI 容器创建,而不是手动执行这个新的 AsyncListener() 实例化。

当然,我希望每个 aync 上下文都有自己的侦听器实例,否则我只会注入一个带有 @Inject 的 AsyncListener 作为 servlet 类的字段。

目前,找不到任何方法来做到这一点。有人有想法可以分享吗?

4

2 回答 2

5

注入Instance你的听众。如果侦听器类在依赖范围内,那么每次调用get()都会产生一个新实例。

@Inject
private Instance<MyAsyncListener> listenerFactory;

和:

    aCtx.addListener(listenerFactory.get());

我已经调用了这个变量listenerFactory,因为这就是它在这里的使用方式。

我在 JBoss AS7.1.1 上对此进行了测试,它使用 Weld 1.1.5 作为其 CDI 提供程序,但我相信这是标准行为。

于 2012-11-14T08:44:55.130 回答
0

实例化 bean 时会处理 bean 的注入点,因此很遗憾您无法显式触发注入。这可能(并且希望会)在 CDI 的后续版本中发生变化。

我知道在某些情况下可以用来解决该限制的一种方法是封装或派生要注入的类,为其提供可注入字段或初始化方法。在这种情况下,它将是AsyncContext,但您无法控制HttpServletRequest将返回的内容,因此此选项在这里不适用。

也许您可以使用CDI BeanManager解决一些问题- 但我担心这需要比调用更多的努力new

于 2012-11-14T08:35:43.513 回答