Jakarta ee 在WebLogic中获取BeanManager对象
BeanManager()的规范指出,“JavaEE组件可以通过查找名称Java:comp/BeanManager从JNDI获取BeanManager的实例。” 我在Jboss 7中为一个类的静态初始值设定项块编写了以下代码,它按预期工作: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 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不工作”
解决方案
要实施解决方案,请执行以下步骤:
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);
}
}