javax.nameing.NameNotFoundException

2022-09-03 18:06:04

我正在运行一个使用JBoss5容器的ejb示例。我在这里使用一个例子(第一部分)。
在示例中,我在 JBoss 中部署了 bean,在 Tomcat 中部署了一个应用程序(用于访问来自 JBoss 的 bean)。我在tomcat服务器
javax.nameing.Name的屏幕中收到错误NotFoundException:greetJndi未绑定

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

谢谢


答案 1

我收到错误 (...) javax.name.NameNotFoundException: greetJndi 未绑定

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

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

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

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

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

  • 有一个额外的字符(< - 这里)在(!)<enterprise-beans>]ejb-jar.xml
  • 在 和 (!!) 之后缺少空格PUBLICejb-jar.xmljboss.xml
  • 不正确,它应该包含一个元素而不是(!!!)jboss.xmlsessionentity

这是一个“固定”版本的: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] Encountered deployment AbstractVFSDeploymentContext@5060868{vfszip:/home/pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar/}
21:48:06,534 INFO  [EjbDeployer] installing bean: ejb/#greetBean,uid19981448
21:48:06,534 INFO  [EjbDeployer]   with dependencies:
21:48:06,534 INFO  [EjbDeployer]   and supplies:
21:48:06,534 INFO  [EjbDeployer]    jndi:greetJndi
21:48:06,624 INFO  [EjbModule] Deploying greetBean
21:48:06,661 WARN  [EjbModule] EJB configured to bypass security. Please verify if this is intended. Bean=greetBean Deployment=vfszip:/home/pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar/
21:48:06,805 INFO  [ProxyFactory] Bound EJB Home 'greetBean' to jndi 'greetJndi'

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


答案 2

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

就 dir 结构而言:您必须使用 EJB 组件创建一个 JAR 文件。据我所知,您希望使用EJB 2.X组件(至少链接的示例表明这一点),因此JAR文件的结构应该是:

/com/mypackage/MyEJB.class /com/mypackage/MyEJBInterface.class /com/mypackage/etc...等。。。java classes /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,只需要 EJB JAR 和 MyEJBInterface 编译类。

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


推荐