我正在使用JBoss5 Container运行ejb示例。我正在使用一个例子
from here(Part one)。
在示例中,我在JBoss中部署了bean,在Tomcat中部署了一个应用程序(从JBoss访问bean)。我在tomcat服务器的屏幕上出现错误
javax.naming.NameNotFoundException:greetJndi未绑定
(greetJndi是jboss.xml文件中的jndi-name) 是否有任何特定的目录结构可以在JBoss中部署?
由于
答案 0 :(得分:25)
我收到错误(...)javax.naming.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
&lt; - HERE)
PUBLIC
和ejb-jar.xml
(!!)jboss.xml
后缺少空格
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] 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。
答案 1 :(得分:4)
错误意味着您正在尝试查找未附加到任何EJB组件的JNDI名称 - 具有该名称的组件不存在。
就dir结构而言:您必须使用EJB组件创建JAR文件。据我所知,您希望使用EJB 2.X组件(至少链接的示例表明),因此JAR文件的结构应为:
/com/mypackage/MyEJB.class /com/mypackage/MyEJBInterface.class / com / mypackage / etc ... 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”。