1

我正在开发一个简单的 JEE 应用程序,并在构建耳朵时尝试选择 @Local 接口实现。我有接口的层次结构:ParentLocal,ChildALocalChildBLocal相应的实现:ChildABean, ChildBBean. 我可以选择使用注解的ChildALocal/ChildBLocal实现。ParentLocal如何使用 ejb-jar.xml 做同样的事情?
ParentLocal.java

@Local
public interface ParentLocal {
    public String getName();
}

ChildALocal.java

@Local
public interface ChildALocal extends ParentLocal {
}

ChildBLocal.java

@Local
public interface ChildBLocal extends ParentLocal {
}

ChildABean.java

@Stateless
public class ChildABean implements ChildALocal {
    @Override
    public String getName() {
        return "ChildA";
    }
}

ChildBBean.java

@Stateless
public class ChildBBean implements ChildBLocal {
    @Override
    public String getName() {
        return "ChildB";
    }
}

ManagerBean.java

@Stateless
public class ManagerBean implements ManagerLocal {
    /**works fine, servlet prints "ChildA", so I would like to get the same result using DD
    @EJB(beanInterface = my.package.model.ChildALocal.class)
    ParentLocal annotatedChildBean;*/

    /**doesn`t work!*/
    @EJB
    ParentLocal childBeanUsingDeploymentDesrciptor;

    //....
}

资源/META-INF/ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
    <description>IBM WAS test application </description>
    <display-name>Test Manager</display-name>
    <enterprise-beans>
        <session>
            <ejb-local-ref>
                <ejb-ref-name>my.package.manager.ManagerBean/childBeanUsingDeploymentDesrciptor</ejb-ref-name>
                <local>my.package.model.ParentLocal</local>
                //doesn`t work
                <!--<local>my.package.model.ChildBLocal</local>--> 
                //doesn`t work
                <ejb-link>ChildBBean</ejb-link> 
            </ejb-local-ref>
        </session>
    </enterprise-beans>
</ejb-jar>

资源/META-INF/ibm-ejb-jar-bnd.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd" version="1.0">
    <session name="ManagerBean">
        //doesn`t work
        <ejb-ref name="my.package.manager.ManagerBean/childBeanUsingDeploymentDesrciptor" binding-name="ejb/session/ChildBBean"/> 
    </session>
</ejb-jar-bnd>

在 WebServlet 中,我注入 ManagerBean 并调用它的方法来打印内部 bean 名称
MainServlet.java

@WebServlet(urlPatterns = "/my_app")
public class MainServlet extends HttpServlet {
    @EJB
    ManagerLocal elementMngr;
    //...
    String childName = elementMngr.getChildNameUsedDeploymentDescriptor();
}

我所有的子实现都在我放入耳朵的单独模块中。当我尝试启动 servlet 时,IBM WebSpehere 8.5.5 显示以下错误:

Error 500: javax.ejb.EJBException: The EJB reference in the war-main-servlet.war module of 
the earManager application could not be resolved; nested exception is: 
com.ibm.ejs.container.EJBNotFoundException: EJB with interface my.package.model.ChildBLocal 
not present in application earManager.

UPD

Error 500: javax.ejb.EJBException: The EJB reference in the war-main-servlet.war module of 
    the earManager application could not be resolved; nested exception is: 
    com.ibm.ejs.container.EJBNotFoundException: EJB with interface my.package.model.ParentLocal
    not present in application earManager.

beanInterfaceejb-jar.xml 或(和)ibm-ejb-jar-bnd.xml 中重复的属性如何?

4

1 回答 1

0

beanInterfaceis <local>(or <remote>)的 DD 等价物和is 的等价beanName<ejb-link>

这个例子的问题似乎是 中的<session>元素ejb-jar.xml没有任何东西可以将它与特定的 EJB 联系起来。当 EJB 名称匹配时,XML 元素被视为对注释的覆盖。由于@Stateless不包含名称,默认值为ManagerBean,因此 XML 应包含:

<enterprise-beans>
    <session>
        <ejb-name>ManagerBean</ejb-name>
        <ejb-local-ref>
            <ejb-ref-name>my.package.manager.ManagerBean/childBeanUsingDeploymentDesrciptor</ejb-ref-name>
                <local>my.package.model.ChildBLocal</local> 
            </ejb-local-ref>
        </session>

<ejb-name>

或者,<local>您可以使用<ejb-link>ChildBBean</ejb-link>.

由于所有 bean 都在同一个应用程序中,ibm-ejb-jar-bnd.xml因此不需要文件。但是,如果您确实想使用绑定文件,此处指定的语法似乎是正确的,因此binding-name值可能不正确。需要有另一个ibm-ejb-jar-bnd.xml文件将其配置ChildBBean为绑定到同一位置。

于 2017-06-20T20:52:42.717 回答