【问题标题】:CDI Injection Outside Filters and Servlets in a Servlet 3.0 ContainerServlet 3.0 容器中的过滤器和 Servlet 外部的 CDI 注入
【发布时间】:2011-08-20 17:29:35
【问题描述】:

我最终决定看看 Tomcat 中的 Weld。当我部署我的应用程序时,我在日志中看到:

“检测到 Tomcat 7,CDI 注入将在 Servlet 和过滤器中可用”

例如,如何使用过滤器/Servlet 之外的 BeanManager 创建 bean 的实例?

我有一颗豆子:

@javax.inject.Named(value="CarService")
@javax.enterprise.context.RequestScoped
public class CarService implements Serializable{
.
.
.

我想使用 BeanManager 为指定的请求上下文创建它的一个实例。

Context ctx = new InitialContext();
BeanManager manager = (BeanManager) ctx.lookup("java:comp/env/BeanManager");
// NOW WHAT?

如果这可以在 servlet/过滤器中完成,我相信它可以在其他任何地方完成,但我只是不想通过 Weld 代码并在不先询问的情况下自己弄清楚。

非常感谢。

【问题讨论】:

  • 我没听懂。你想做什么?你想在哪个类中使用这个 bean?

标签: tomcat cdi jboss-weld


【解决方案1】:

很少使用BeanManager。关键是在需要依赖的地方使用@Inject(即依赖注入)。使用管理器是“服务定位器”模式。

如果您真的需要它,请使用manager.getBeans(yourDesiredClass),然后从集合中选择一个并致电manager.getReference(bean, theClass, ctx)ctx会被manager.createCreationalContext(bean)获取

【讨论】:

  • 感谢您的帮助!我需要的原因是因为我希望 BlazeDS 使用 BeanManager,这将允许我在服务对象中使用注入。所以我认为这是一个实际需要的情况。方法 manager.resolve(manager.getBeans(type)) 为我解析 bean,而无需按照您的建议进行设置。
  • 啊哈。 flex 集成确实看起来像是一个可能需要与 bean 管理器交互的地方。
【解决方案2】:

我已经使用了这个 Seam 代码,它给了我所需的一切。

public static <T> T getContextualInstance(final BeanManager manager, final Class<T> type) {
        T result = null;
        Bean<T> bean = (Bean<T>) manager.resolve(manager.getBeans(type));
        if (bean != null) {
            CreationalContext<T> context = manager.createCreationalContext(bean);
            if (context != null) {
                result = (T) manager.getReference(bean, type, context);
            }
        }
        return result;
    }

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 2013-10-22
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多