如何在Jboss 7中通过jndi名称调用我的战争罐中的ejb类

时间:2018-02-09 12:47:20

标签: java-ee jboss ejb

在我的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服务器

1 个答案:

答案 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类。

     

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目录中打包类。

     <。> .war文件可能包含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();

我已在当地环境中对此进行了验证。