WebLogic中获取BeanManager对象

Obtaining a BeanManager object in WebLogic

BeanManager (https://docs.oracle.com/javaee/6/api/javax/enterprise/inject/spi/BeanManager.html) 的规范说 "Java EE components may obtain an instance of BeanManager from JNDI by looking up the name java:comp/BeanManager."

我在 Jboss 7 中将以下代码写入 class 的静态初始化程序块,它按预期工作:

BeanManager beanManager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager");

我尝试在 WebLogic 12.1.2.0.0 中执行相同的操作,但出现以下错误:

javax.naming.NameNotFoundException: remaining name: comp/BeanManager
at weblogic.j2eeclient.SimpleContext.internalLookup(SimpleContext.java:77)
at weblogic.j2eeclient.SimpleContext.lookup(SimpleContext.java:39)
at weblogic.jndi.SimpleContext.lookup(SimpleContext.java:86)
at weblogic.jndi.factories.java.ReadOnlyContextWrapper.lookup(ReadOnlyContextWrapper.java:45)
at weblogic.jndi.internal.AbstractURLContext.lookup(AbstractURLContext.java:130)
at javax.naming.InitialContext.lookup(InitialContext.java:411)...

为什么它在 WebLogic 中不起作用?

更新:

如果我调用 CDI.current() 方法,我会得到一个 IllegalStateException,所以这也无济于事。 当我调用 new InitialContext().lookup("java:comp/BeanManager") 方法时,InitialContext 不包含 java:comp 命名空间,只有一个 java:global 命名空间。

我遇到了同样的问题,看起来这是 Weblogic 中的一个错误。

"Bug 18026126 - STATIC VARIABLE BEANMANAGER IS NOT WORKING"

解决方案

要实施解决方案,请执行以下步骤:

  1. 下载并查看补丁 18026126 的自述文件和先决条件。
  2. 确保在应用推荐的补丁程序之前对系统进行了备份。
  3. 在测试环境中应用补丁。
  4. 重新测试问题。
  5. 根据需要将解决方案迁移到其他环境。

BUG说明如下:

静态变量 BEANMANAGER 不工作

 private static BeanManagerBeanTest bmbs =
    (BeanManagerBeanTest)BeanLookupUtil.getCdiBean("beanManagerBeanTest")
throws lookup exception and if we remove static it's working
 public class BeanLookupUtil {

        public static BeanManager getBeanManager(){
            BeanManager beanManager = null;
            try {
                beanManager = (BeanManager)new
    InitialContext().lookup("java:comp/BeanManager");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return beanManager;
        }

        public static Object getCdiBean(String name){
            Object obj = null;
            try {
                BeanManager bm = getBeanManager();
                Set<Bean<?>> beanSet = bm.getBeans(name);
                if(!beanSet.isEmpty()){
                    Bean<?> bean = beanSet.iterator().next();
                    CreationalContext<?> ctx = bm.createCreationalContext(bean);
                    obj = bm.getReference(bean, bean.getBeanClass(), ctx);
                }
            } catch (Exception e) {
                            e.printStackTrace();
            }
            return obj;
        }

    }

    public class TestCtrl {

        private static BeanManagerBeanTest bmbs =
    (BeanManagerBeanTest)BeanLookupUtil.getCdiBean("beanManagerBeanTest");

        public void beanmanagertest() {
            BeanManager beanManager = null;
            try {
                //BeanManagerBeanTest bmbs =
    (BeanManagerBeanTest)BeanLookupUtil.getCdiBean("beanManagerBeanTest");
                bmbs.sum(10, 10);
            } catch (Exception e) {
                log.error("Lookup Error:", e);
            }
        }

问题发生在 WebLogic 的开发人员版本上。在我们安装了它的中间件版本之后,它可以在 12.1.2 和 1.2.1.3 版本中工作。