Jakarta ee 在WebLogic中获取BeanManager对象

Jakarta ee 在WebLogic中获取BeanManager对象,jakarta-ee,weblogic,cdi,Jakarta Ee,Weblogic,Cdi,BeanManager()的规范指出,“JavaEE组件可以通过查找名称Java:comp/BeanManager从JNDI获取BeanManager的实例。” 我在Jboss 7中为一个类的静态初始值设定项块编写了以下代码,它按预期工作: BeanManager beanManager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager"); 我尝试在WebLogic 12.1.2.0.0中执行相同的操作,但出

BeanManager()的规范指出,“JavaEE组件可以通过查找名称Java:comp/BeanManager从JNDI获取BeanManager的实例。”

我在Jboss 7中为一个类的静态初始值设定项块编写了以下代码,它按预期工作:

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
,所以这也没有帮助。
当我调用
newinitialcontext().lookup(“java:comp/BeanManager”)
方法时,
InitialContext
不包含
java:comp
名称空间,只有
java:global
名称空间。

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

“错误18026126-静态变量BEANMANAGER不工作”

解决方案

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

  • 下载并查看修补程序18026126的自述和先决条件
  • 在应用建议的修补程序之前,请确保已备份系统
  • 在测试环境中应用修补程序
  • 重新测试问题
  • 根据需要将解决方案迁移到其他环境
  • 以下是错误描述:

    静态变量BEANMANAGER不工作

     private static BeanManagerBeanTest bmbs =
        (BeanManagerBeanTest)BeanLookupUtil.getCdiBean("beanManagerBeanTest")
    
    公共类BeanLookupUtil{
    公共静态BeanManager getBeanManager(){
    BeanManager BeanManager=null;
    试一试{
    beanManager=(beanManager)新建
    InitialContext().lookup(“java:comp/BeanManager”);
    }捕获(例外e){
    e、 printStackTrace();
    }
    返回beanManager;
    }
    公共静态对象getCdiBean(字符串名称){
    objectobj=null;
    试一试{
    BeanManager bm=getBeanManager();
    Set bean=beanSet.iterator().next();
    CreationalContext ctx=bm.createCreationalContext(bean);
    obj=bm.getReference(bean,bean.getBeanClass(),ctx);
    }
    }捕获(例外e){
    e、 printStackTrace();
    }
    返回obj;
    }
    }
    公共类TestCtrl{
    专用静态BeanManager BeanTest BMB=
    (BeanManagerBeanTest)BeanLookupUtil.getCdiBean(“BeanManagerBeanTest”);
    public void beanmanagertest(){
    BeanManager BeanManager=null;
    试一试{
    //beanmanagerbeantestbmbs=
    (BeanManagerBeanTest)BeanLookupUtil.getCdiBean(“BeanManagerBeanTest”);
    bmbs.总和(10,10);
    }捕获(例外e){
    log.error(“查找错误:”,e);
    }
    }
    
    问题发生在WebLogic的开发人员版本上。我们安装了WebLogic的中间件版本后,它在12.1.2和1.2.1.3版本中都能正常工作。

    包含此类的JAR是否包含
    bean.xml
    ?是的,它包含。应用程序在JBoss环境中工作。如果bean.xml不在指定的位置,它将无法在JBoss上运行。是否可以在没有支持标识符的情况下下载此修补程序?不这样认为,但您可以获得12.1.3版本,其中可能包含此版本。
    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);
                }
            }