ejb查找失败,出现NamingException

我在web.xml中添加了以下内容:

 ejb/userManagerBean Session gha.ywk.name.entry.ejb.usermanager.UserManagerHome what should go here??  

以下java代码给我NamingException:

 public UserManager getUserManager () throws HUDException { String ROLE_JNDI_NAME = "ejb/userManagerBean"; try { Properties props = System.getProperties(); Context ctx = new InitialContext(props); UserManagerHome userHome = (UserManagerHome) ctx.lookup(ROLE_JNDI_NAME); UserManager userManager = userHome.create(); WASSSecurity user = userManager.getUserProfile("user101", null); return userManager; } catch (NamingException e) { log.error("Error Occured while getting EJB UserManager" + e); return null; } catch (RemoteException ex) { log.error("Error Occured while getting EJB UserManager" + ex); return null; } catch (CreateException ex) { log.error("Error Occured while getting EJB UserManager" + ex); return null; } } 

代码在容器内使用。 我的意思是.WAR部署在服务器(Sun Application Server)上。

StackTrace(在jsight的建议之后):

 >Exception occurred in target VM: com.sun.enterprise.naming.java.javaURLContext.(Ljava/util/Hashtable;Lcom/sun/enterprise/naming/NamingManagerImpl;)V java.lang.NoSuchMethodError: com.sun.enterprise.naming.java.javaURLContext.(Ljava/util/Hashtable;Lcom/sun/enterprise/naming/NamingManagerImpl;)V at com.sun.enterprise.naming.java.javaURLContextFactory.getObjectInstance(javaURLContextFactory.java:32) at javax.naming.spi.NamingManager.getURLObject(NamingManager.java:584) at javax.naming.spi.NamingManager.getURLContext(NamingManager.java:533) at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:279) at javax.naming.InitialContext.lookup(InitialContext.java:351) at gov.hud.pih.eiv.web.EjbClient.EjbClient.getUserManager(EjbClient.java:34) 

我想您想从Sun Application Server中的Web应用程序访问EJB应用程序(称为EJB模块),对吗?

好了,走吧。

将EJB部署到应用程序服务器时,应用程序服务器会为其提供一个地址(称为全局JNDI地址),作为一种可以访问它的方式(类似于您的地址)。 它从应用程序服务器更改为另一个

在JBoss Application Server中,您可以在以下地址中查看全局JNDI地址(启动后)

 http://127.0.0.1:8080/jmx-console/HtmlAdaptor 

在Sun Application Server中,如果要查看全局JNDI地址(启动后),请执行以下操作

访问以下地址中的管理控制台

 http://127.0.0.1:4848/asadmin 

然后单击JNDI浏览

如果你的EJB没有在那里注册,那就有问题了

EJB有两种forms:EJB 2.1和EJB 3.0。 那么区别是什么呢 ?

好吧,好吧……

让我们从EJB 2.1开始

  1. 创建一个Home界面

它定义了创建,销毁和查找本地或远程EJB对象的方法。 它充当EJB对象的生命周期接口。 所有home接口都必须扩展标准接口javax.ejb.EJBHome – 如果你使用远程ejb对象 – 或者javax.ejb.EJBLocalHome – 如果你使用的是本地EJB对象。

 // a remote EJB object - extends javax.ejb.EJBHome // a local EJB object - extends javax.ejb.EJBLocalHome public interface MyBeanRemoteHome extends javax.ejb.EJBHome { MyBeanRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException; } 

Application Server将创建Home对象作为获取EJB对象的方式,而不是其他任何方式。

请注意以下事项

会话bean的远程home接口必须定义一个或多个创建方法。 无状态会话bean必须完全定义一个没有参数的方法。

throws子句必须包含javax.ejb.CreateException

如果你的Home接口扩展了javax.ejb.EJBHome,则throws子句必须包含java.rmi.RemoteException。 如果它扩展javax.ejb.EJBLocalHome,则不得包含java.rmi.RemoteException。

必须创建的有状态会话bean的每个create方法都必须匹配会话bean类中定义的Init方法或ejbCreate 方法之一。 匹配的ejbCreate 方法必须具有相同的数量和类型的参数。 必须创建无状态会话bean的create方法,但不需要匹配的“ejbCreate”方法。


现在创建一个业务接口,以便在EJB对象中定义业务逻辑

 // a remote EJB object - extends javax.ejb.EJBObject // a local EJB object - extends javax.ejb.EJBLocalObject public interface MyBeanRemote extends javax.ejb.EJBObject { void doSomething() throws java.rmi.RemoteException; } 

现在请注意以下事项

如果您使用的是远程EJB对象,则远程接口方法不得暴露本地接口类型或本地home接口类型。

如果Home接口扩展了javax.ejb.EJBObject,则throws子句必须包含java.rmi.RemoteException。 如果它扩展了javax.ejb.EJBLocalObject,则不得包含java.rmi.RemoteException。


现在我们的EJB

 public class MyBean implements javax.ejb.SessionBean { // why create method ? Take a special look at EJB Home details (above) public void create() { System.out.println("create"); } public void doSomething() throws java.rmi.RemoteException { // some code }; } 

现在请注意以下事项

它必须实现javax.ejb.SessionBean。 它定义了四种方法 – 上面没有显示:setSessionContext,ejbRemove,ejbPassivate和ejbActivate。

请注意,由于EJB规范,我们的bean 不会实现我们的业务接口:

对于接口中定义的每个方法,会话bean的类中必须有匹配的方法 。 匹配方法必须具有:

  • 同名
  • 相同数量和类型的参数以及相同的返回类型。
  • 必须在本地接口方法的throws子句中定义会话bean类的匹配方法的throws子句中定义的所有exception。

并且您必须根据以下内容声明ejb-jar.xml文件

     HelloWorldEJB br.com.MyBeanRemoteHome br.com.MyBeanRemote br.com.MyBeanLocalHome br.com.MyBeanLocal br.com.MyBean Stateless Container    

如果没有从上面的部署描述符中删除本地EJB对象

 br.com.MyBeanLocalHome br.com.MyBeanLocal 

如果没有从上面的部署描述符中删除远程EJB对象

 br.com.MyBeanRemoteHome br.com.MyBeanRemote 

并放入META-INF目录

我们的jar文件将包含以下内容

 /META-INF/ejb-jar.xml br.com.MyBean.class br.com.MyBeanRemote.class br.com.MyBeanRemoteHome.class 

现在我们的EJB 3.0

 // or @Local // You can not put @Remote and @Local at the same time @Remote public interface MyBean { void doSomething(); } @Stateless public class MyBeanStateless implements MyBean { public void doSomething() { } } 

没有其他的,

在JBoss中放入jar文件

 /server/default/deploy 

在Sun Application Server访问(启动后)管理控制台

 http://127.0.0.1:4848/asadmin 

并访问EJB模块以部署您的ejb-jar文件

由于在NetBeans中部署应用程序时遇到一些问题,我建议如下

  1. 创建一个简单的Java库PROJECT(一个没有main方法的简单jar)
  2. 无论您使用的是JBoss(我不知道Sun Application Server中的哪个目录),都将/ server / default / lib(包含jar文件,以便检索EJB)jar文件添加到Java应用程序中
  3. 实现上面的代码

现在创建另一个战争PROJECT

  1. 添加上面创建的项目并添加 / client(包含jar文件以访问我们的EJB)。 我再也不知道Sun Application Server中的哪个目录。 查看其文档。
  2. 查看其全局映射地址,如答案顶部所示

无论您使用的是JBoss,还是在Servlet中实现以下代码

 public static Context getInitialContext() throws javax.naming.NamingException { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces"); p.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); return new javax.naming.InitialContext(p); } 

或者以下是否使用Sun Application Server – 在类路径中放置文件appserv-rt.jar(我不知道哪个过去在Sun Application Server中包含appserv-rt.jar)

 public static Context getInitialContext() throws javax.naming.NamingException { return new javax.naming.InitialContext(); } 

为了在我们的Servlet中访问您的EJB或其他东西

 MyBeanRemote myBean = (MyBeanRemote) getInitialContext().lookup(); myBean.doSomething(); 

问候,

也许查找字符串实际应该是:“java:comp / env / ejb / userManagerBean”?

最后两个答案都是正确的,因为它们是您需要更改/修复的内容。 但是你看到的NoSuchMethodError不是来自你的代码,也不是来自试图找到你的代码的东西(会产生某种NoClassDefFoundException,我认为是这样的)。 这看起来更像是容器提供的JNDI提供程序的不兼容版本,以及Java库中的JNDI实现需要什么。 这是一个非常模糊的答案,但是,可以想象它可以通过升级您的应用程序服务器来解决,并且确保您没有在您的应用程序中部署与JNDI相关的可能过时的基础结构类副本,这可能会产生干扰。

首先,修复web.xml并在其中添加远程接口:

  Sample EJB SampleBean Session com.SampleHome com.Sample   

然后,关于java.lang.NoSuchMethodError ,Sean是对的,您在NetBeans中使用的应用服务器“客户端库”的版本与应用服务器版本(服务器端)之间存在不匹配。 我无法确切地告诉您需要对齐哪些JAR,请参阅Sun Application Server文档。

PS:这不是问题的直接答案,但我不认为你在使用调用System.getProperties()的结果创建初始上下文时,当前正在传递任何有用的属性,这些属性没有任何帮助定义上下文的环境(例如初始上下文工厂)。 有关更多详细信息,请参阅InitialContext javadocs。