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"
解决方案
要实施解决方案,请执行以下步骤:
- 下载并查看补丁 18026126 的自述文件和先决条件。
- 确保在应用推荐的补丁程序之前对系统进行了备份。
- 在测试环境中应用补丁。
- 重新测试问题。
- 根据需要将解决方案迁移到其他环境。
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 版本中工作。
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"
解决方案
要实施解决方案,请执行以下步骤:
- 下载并查看补丁 18026126 的自述文件和先决条件。
- 确保在应用推荐的补丁程序之前对系统进行了备份。
- 在测试环境中应用补丁。
- 重新测试问题。
- 根据需要将解决方案迁移到其他环境。
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 版本中工作。