在我的Web应用程序中,我使用了ejb,它作为jar存在于我的项目的lib文件夹中,ejb类和接口现在没有注释我不知道如何通过jndi名称从我的应用程序调用该ejb类,我正在将我的应用程序部署为war文件并使用jboss 7 EAP服务器,以及 我不能将ejb类更改为注释,因为它是一个现有的应用程序。请帮助如何实现这一点。
web.xml: -
<ejb-ref>
<ejb-ref-name>local/com/BusinessService</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.common.ejb.service.BusinessServiceLocalHome</home>
<remote>com.common.ejb.service.BusinessServiceLocal</remote>
<ejb-link>BusinessService.jar#BusinessService</ejb-link>
</ejb-ref>
在我的java文件中,我正在访问如下: -
javax.naming.Context ic = new javax.naming.InitialContext();
initCtx.lookup("java:comp/env/local/com/BusinessService");
但总是我得到javax.naming.NameNotFoundException:local / com / BusinessService
ejb-jar.xml:这是businesservice.jar的meta-inf文件夹
<?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 id="ejb-jar_ID">
<display-name>BusinessService</display-name>
<enterprise-beans>
<session id="BusinessService">
<ejb-name>BusinessService</ejb-name>
<home>com.common.ejb.service.BusinessServiceHome</home>
<remote>com.common.ejb.service.BusinessService</remote>
<local-home>com.common.ejb.service.BusinessServiceLocalHome</local-home>
<local>com.common.ejb.service.BusinessServiceLocal</local>
<ejb-class>com.common.ejb.service.BusinessServiceBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>BusinessService</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
--->and also when i am adding <local-home> tag in web.xml its showing error. so i removed the tag
我尝试过很多替代方案,比如ejb / local / com / BusinessService,但我面临同样的问题,请帮帮....
注意: - 我正在使用jboss EAP服务器
答案 0 :(得分:0)
我最终不得不为自己进行RTFM。
当前的EJB 3.2规范如下:
15.4 企业Bean打包在.war文件中
具有组件定义注释的企业bean类在打包到WEB-INF/classes
目录或WEB-INF/lib
目录中的jar文件中时定义企业bean组件。企业bean也可以通过WEB-INF/ejb-jar.xml
部署描述符来定义。
.war
文件可能包含WEB-INF/classes
目录中的类和WEB-INF/lib
目录中的一个或多个jar文件的组合中的企业bean类。<。> .war文件可能包含
WEB-INF/lib
目录中包含企业bean的“ejb-jar”文件不像独立的.war文件那样被视为独立的Java EE“模块”ejb-jar文件或.ear级别的ejb-jar文件被视为模块。这样的“ejb-jar文件”没有为ejb-names,环境依赖,持久性单元等定义自己的模块名称或自己的命名空间。所有这些命名空间都限定在封闭的.war文件中。从这个意义上说,企业bean类在WEB-INF/lib
目录中的“ejb-jar”文件中打包只是一种方便。它在语义上等同于在WEB-INF / classes目录中打包类。ejb-jar.xml
个文件。如果存在,则ejb-jar.xml
打包为WEB-INF/ejb-jar.xml
。如果存在ejb-jar.xml
,它将应用于.war文件定义的所有企业bean,无论它们是与WEB-INF/classes
目录一起打包还是在WEB-INF/lib
内的jar文件中打包目录。在ejb-jar.xml
文件中的任何其他位置打包.war
文件是不可移植的,可能会导致部署错误。
简短的回答是将ejb-jar.xml
文件移到应用程序的WEB-INF
目录中,紧挨着web.xml
。
其次,您需要按如下方式添加ejb-ref
:
<ejb-local-ref>
<ejb-ref-name>local/com/BusinessService</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>com.common.ejb.service.BusinessServiceLocalHome</local-home>
<local>com.common.ejb.service.BusinessServiceLocal</local>
</ejb-local-ref>
随后,以下查找代码可以正常工作:
Context initialContext = new InitialContext();
Object homeObj = initialContext.lookup("java:comp/env/local/com/BusinessService");
BusinessServiceLocalHome businessServiceLocalHome
= (BusinessServiceLocalHome) PortableRemoteObject.narrow
(homeObj, BusinessServiceLocalHome.class);
BusinessServiceLocal businessServiceLocal = businessServiceLocalHome.create();
businessServiceLocal.businessMethod();
我已在当地环境中对此进行了验证。