javax.naming.NameNotFoundException

Posted

技术标签:

【中文标题】javax.naming.NameNotFoundException【英文标题】: 【发布时间】:2011-04-24 03:14:33 【问题描述】:

我正在运行一个使用 JBoss5 容器的 ejb 示例。我正在使用一个例子 from here(Part one)。 在示例中,我在 JBoss 中部署了 bean,在 Tomcat 中部署了一个应用程序(从 JBoss 访问 bean)。我在 tomcat 服务器的屏幕上收到错误 : greetJndi 未绑定

( greetJndi 是 jboss.xml 文件中的 jndi-name ) 在 JBoss 中是否有任何特定的目录结构可以部署?

谢谢

【问题讨论】:

【参考方案1】:

我收到错误 (...) javax.naming.NameNotFoundException: greetJndi not bound

这意味着没有任何东西与 jndi 名称 greetJndi 绑定,很可能是因为部署问题,因为本教程的质量非常低(检查服务器日志)。我会回来的。

在 JBoss 中是否有任何特定的目录结构可以部署?

ejb-jar 的内部结构应该是这样的(使用糟糕的命名约定和默认包,如提到的链接):

. ├──greetBean.java ├── greetHome.java ├──greetRemote.java └── META-INF ├── ejb-jar.xml └── jboss.xml

但如前所述,本教程充满了错误:

ejb-jar.xml (!) 中有一个额外的字符 (<enterprise-beans>] ejb-jar.xmljboss.xml 中的PUBLIC 后面缺少一个空格(!!) jboss.xml 不正确,它应该包含 session 元素而不是 entity (!!!)

这是ejb-jar.xml 的“固定”版本:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
  <enterprise-beans>
    <session>
      <ejb-name>greetBean</ejb-name>
      <home>greetHome</home>
      <remote>greetRemote</remote>
      <ejb-class>greetBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>
  </enterprise-beans>
</ejb-jar>

还有jboss.xml

<?xml version="1.0"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd">
<jboss>
  <enterprise-beans>
    <session>
      <ejb-name>greetBean</ejb-name>
      <jndi-name>greetJndi</jndi-name>
    </session>
  </enterprise-beans>
</jboss>

在完成这些更改并重新打包 ejb-jar 之后,我能够成功部署它:

21:48:06,512 INFO [Ejb3DependenciesDeployer] 遇到部署 AbstractVFSDeploymentContext@5060868vfszip:/home/pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar/ 21:48:06,534 INFO [EjbDeployer] 安装 bean:ejb/#greetBean,uid19981448 21:48:06,534 具有依赖关系的信息 [EjbDeployer]: 21:48:06,534 信息 [EjbDeployer] 和用品: 21:48:06,534 信息 [EjbDeployer] jndi:greetJndi 21:48:06,624 信息 [EjbModule] 部署 greetBean 21:48:06,661 WARN [EjbModule] EJB 配置为绕过安全性。请验证这是否是有意的。 bean=greetBean 部署=vfszip:/home/pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar/ 21:48:06,805 INFO [ProxyFactory] ​​将 EJB Home 'greetBean' 绑定到 jndi 'greetJndi'

该教程需要显着改进;我建议不要远离roseindia.net。

【讨论】:

你能帮忙写这篇文章吗:***.com/questions/28996931/…【参考方案2】:

该错误意味着您正在尝试查找未附加到任何 EJB 组件的 JNDI 名称 - 具有该名称的组件不存在。

就目录结构而言:您必须创建一个带有 EJB 组件的 JAR 文件。据我了解,您想使用 EJB 2.X 组件(至少链接示例表明这一点),因此 JAR 文件的结构应该是:

/com/mypackage/MyEJB.class /com/mypackage/MyEJBInterface.class /com/mypackage/etc...等...java类 /META-INF/ejb-jar.xml /META-INF/jboss.xml

JAR 文件或多或少是 ZIP 文件,文件扩展名从 ZIP 更改为 JAR。

顺便说一句。如果您使用 JBoss 5,则可以使用更容易配置的 EJB 3.0。最简单的组件是

@Stateless(mappedName="MyComponentName")
@Remote(MyEJBInterface.class)
public class MyEJB implements MyEJBInterface
   public void bussinesMethod()

   

不需要 ejb-jar.xml,需要 jboss.xml,只需要带有 MyEJB 和 MyEJBInterface 编译类的 EJB JAR。

现在您需要在您的客户端代码中查找“MyComponentName”。

【讨论】:

以上是关于javax.naming.NameNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章