在非托管 CDI Bean 中引用 CDI Bean

2024-04-14

是否可以在使用创建的类中获取 CDI bean 的实例new关键词?我们目前正在对旧应用程序进行一些增强,并且我们总是会得到上下文不活跃异常 http://docs.jboss.org/cdi/api/1.0/javax/enterprise/context/ContextNotActiveException.html每次我们做一个程序化的 http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/在我们的应用程序中查找 CDI Singleton beans。

获取参考代码:

public class ClassCreatedWithNew{
     public void doSomething(){
         MySingletonBean myBean = BeanManagerSupport.getInstance().getBean(MySingletonBean.class);
     }
}

BeanManagerSupport.java

public class BeanManagerSupport {

    private static final Logger LOG = Logger.getLogger(BeanManagerSupport.class);

    private static final BeanManagerSupport beanManagerSupport = new BeanManagerSupport();

    private BeanManager beanManager;

    private BeanManagerSupport() {
        try {
            beanManager = InitialContext.doLookup("java:comp/BeanManager");
        } catch (NamingException e) {
            LOG.error("An error has occured while obtaining an instance of BeanManager", e);
        }
    }

    @SuppressWarnings("unchecked")
    public <T> T getBean(Class<T> clazz) {
        Iterator<Bean< ? >> iter = beanManager.getBeans(clazz).iterator();

        if (!iter.hasNext()) {
            throw new IllegalStateException("CDI BeanManager cannot find an instance of requested type " + clazz.getName());
        }

        Bean<T> bean = (Bean<T>) iter.next();

        return (T) beanManager.getContext(bean.getScope()).get(bean);
    }

    public static BeanManagerSupport getInstance(){
        return beanManagerSupport;
    }
}

有两种可能的解决方案。

  1. 如果您有 JavaEE-7 容器,那么您可以使用CDI.current().get(MySingletonClass.class);

  2. 如果您有 JavaEE-6 容器甚至 Java SE 应用程序,那么您可以使用Apache DeltaSpike BeanProvider http://deltaspike.apache.org/documentation/core.html#_beanprovider。 它尝试从 JNDI 查找 BeanManager,但也执行其他技巧,如果您没有完整的 EE 容器,这些技巧也可以工作。例如。在SE和单元测试中。

您还需要注意不仅容器已启动,而且上下文也已正确激活。这通常是通过 ServletListener 完成的。如果您位于 EE 容器中,那么他们会为您注册。如果您使用的是普通的 tomcat、jetty 等,那么您需要自己激活它。

See 这个例子 https://github.com/apache/openwebbeans/blob/trunk/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java来自 Apache OpenWebBeans。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在非托管 CDI Bean 中引用 CDI Bean 的相关文章

随机推荐

  • 使用 AzureReader2 调整图像大小会导致 404

    当我尝试使用 AzureReader2 调整图像大小时 收到 404 错误 但是 在使用存储模拟器进行开发时不会发生这种情况 仅在部署到 Azure 时才会发生 当没有调整大小时也不会发生这种情况 So http myapp azurewe
  • 如何使用 SQLiteOpenHelper 与 sd 卡上的数据库?

    根据这里和网络扩展应用程序中的各种答案及其继承的方法 getDatabasePath 将允许设置从标准内部存储器位置到插入的更大尺寸的 SD 卡的数据库存储路径 这对我不起作用 建议的构造仍然使用内存上的数据库 事实上 SQLiteOpen
  • 推送通知中不播放声音

    我使用的是 iOS 7 我的推送通知不播放声音 Strangely I found there is no setting for sound in the Preference gt Notification Center for my
  • 使用 Javascript 函数更改 onclick 操作

    我有一个按钮
  • 创建额外的 D3.js 符号

    D3 已经具有很多功能symbols https github com mbostock d3 wiki SVG Shapes wiki symbol 但我想添加一个自定义的 这样我就可以打电话d3 svg symbol type cust
  • Android底部导航栏项目背景颜色在选择fragment时发生变化

    我希望我的底部导航栏在按下时改变背景颜色 仅选定区域 就像下面的链接一样 http uupload ir files nq3k tab bar jpg http uupload ir files nq3k tab bar jpg 这是我的选
  • nifi invokehttp post复杂的json

    我尝试在 Apache NiFi 中使用 InvokeHttpProcessor 来执行具有复杂 JSON 正文的 POST 请求 因此本教程 http www tomaszezula com 2016 10 30 nifi and htt
  • PostgreSQL 中是否有可用的多值字段类型?

    我想知道是否可以在 PostgreSQL 的一个字段中存储多个值 我有一张桌子叫Token与列id text and category category是一个多值字段 是否有必要为其创建一个单独的表 或者有没有办法将其存储在Token ta
  • java.lang.NoSuchMethodError:没有静态方法 getDrawable(Landroid/content/Context;I)

    正在将 Socialize SDK 集成到我的应用程序中 我还将 Android Studio 更新到了 2 3 3 我的 Activity 的 super onCreate savedInstanceState 给了我一个错误 这里也提出
  • malloc(0) 的行为

    int main char p p char malloc sizeof char 0 printf Hello Enter the data without spaces n scanf s p printf The entered st
  • 如何在 Java 中定义重复的枚举常量?

    我想定义一个具有两个 值 相同的常量的枚举类型 我将这两个常量称为重复项 考虑以下示例 我想要定义一个浏览器类型列表 并且想要同时拥有文字 IE 和 InternetExplorer 如下所示 enum Browser CHROME chr
  • 关闭SKScene后,内存仍然居高不下

    我使用dispatch onceNSObject创建数据指针 因此 当主视图控制器出现时 所有游戏资源指针都会被创建 为了玩游戏 用户点击UIButton对应于某个特定级别UI视图控制器 让我称之为 LevelSelectionContro
  • AXML 和 XAML 之间的区别?

    我是 Visual Studio Xamarin 跨平台移动开发的新手 我一直在搜索 AXML 但我找不到任何设计和应用 MVC 方法的教程 实际上我对此有很多疑问 但我先把这 3 留在这里 他们有什么区别 xaml设计可以应用在axml中
  • 使用 psycopg cur.execute 创建 postgres 模式

    我的 python 应用程序允许用户创建其命名模式 我需要一种方法来保护应用程序免受 SQL 注入 要执行的SQL读取 CREATE SCHEMA schema name AUTHORIZATION user name psycopg 文档
  • PHP 正则表达式生成器

    我现在已经获得了满足以下所需条件的有效正则表达式字符串 一行 php 就绪正则表达式 包含许多关键字和关键术语 并且至少匹配其中一个 例如 关键术语 apple banana strawberry pear cake 现在 如果找到任何这些
  • git、mercurial、bazaar 源代码库的可理解性

    我想阅读一种流行的版本控制工具的源代码 以了解版本控制的工作原理 我想读一本最具可读性的书 我不知道对此有什么客观 定量的衡量标准 所以本着WTF 分钟漫画 http www osnews com story 19266 WTFs m 想请
  • 内容提供商中 Android 投影图的用途是什么?

    我正在查看 Android 记事本应用程序示例代码
  • Firefox Web 扩展“无法访问死对象”错误

    我很难找到这个问题的最新答案 并且经常没有时间在这里回答问题 所以我想我会发布这个 这样我就可以回答我自己的问题 因为我找到了解决方案 我正在为 Chrome 和 Firefox 制作一个 Web 扩展 Firefox 有一个问题 当我从选
  • 跨浏览器选项卡共享 websocket?

    我们希望每个浏览器都有一个套接字 而不是浏览器中的每个选项卡都有一个套接字 我们怎样才能实现它呢 我读到了有关共享网络工作者的文章 这很有前途 对此的参考也值得赞赏 不幸的是 据我所知 共享网络工作者尚未被 Mozilla 或 Intern
  • 在非托管 CDI Bean 中引用 CDI Bean

    是否可以在使用创建的类中获取 CDI bean 的实例new关键词 我们目前正在对旧应用程序进行一些增强 并且我们总是会得到上下文不活跃异常 http docs jboss org cdi api 1 0 javax enterprise