我正在开发一个简单的 JEE 应用程序,并在构建耳朵时尝试选择 @Local 接口实现。我有接口的层次结构:ParentLocal
,ChildALocal
和ChildBLocal
相应的实现: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.
beanInterface
ejb-jar.xml 或(和)ibm-ejb-jar-bnd.xml 中重复的属性如何?