【发布时间】:2012-08-09 16:01:39
【问题描述】:
出于某些原因,我想将我的应用程序部署为两个单独的工件:Users-ejb.jar 和 Users-war.war,没有打包在同一个工件中ear(但仍然部署在相同 JBoss AS 7.1 实例中)。在 Users-war.war 中,我有一个支持 bean(注释为 JSF 托管 bean),我希望在其中注入一个封装在 Users-ejb.jar 中的 EJB3。简单的 @EJB 注入在 Users-ejb.jar 和>Users-war.war单独部署。
我的设置的缩小简化示例如下:
EJB3 bean
import javax.ejb.*;
(...)
@Stateless(name="userFacade")
@Local(IUserFacadeLocal.class)
@Remote(IUserFacadeRemote.class)
public class UserFacade extends AbstractFacade<User> implements IUserFacadeLocal, IUserFacadeRemote {
支持 bean
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.ejb.EJB;
import entities.User;
import facades.IUserFacadeRemote;
import facades.IUserFacadeLocal;
@ManagedBean(name="indexBackingBean")
@SessionScoped
public class IndexBackingBean implements Serializable {
@EJB(beanName="userFacade")
private IUserFacadeLocal userFacade;
我尝试了各种组合,例如将支持 bean 中的 EJB3 bean 的类型声明为 IUserFacadeRemote(而不是 IUserFacadeLocal),但是当 Users-war.war 模块已部署:
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException:
JBAS014543: No EJB found with interface of type 'facades.IUserFacadeLocal' and
name 'userFacade' for binding controllers.IndexBackingBean/userFacade
Users-ejb.jar 部署到 JBoss AS 7.1 没有任何抱怨,但是当 Users-war.war 部署时,JBoss 抱怨它不能找到他应该注射的豆子。
但是,我可以使用 JNDI 获得对 EJB3 bean 的引用:
String jndiName = "java:global/Users-ejb/userFacade!facades.IUserFacadeRemote";
this.userFacade = (IUserFacadeRemote) new InitialContext().lookup(jndiName);
尽管如此,@EJB 注入似乎不起作用。
更新: 我遵循了Tom Anderson 给出的以下建议,并且有效的注入是:
@EJB(mappedName = "java:global/Users-ejb/userFacade!facades.IUserFacadeRemote")
如果我理解正确,它使用供应商特定的 mappedName 属性。我无法让注入以独立于供应商的方式工作。
【问题讨论】:
-
看看这个example。它适用于 GlassFish,但也许可以帮助...
-
我的建议是否有效?我很想知道!
-
我目前正忙于另一个问题,当我尝试您的建议时肯定会报告。目前我正在使用我在帖子末尾添加的 JNDI 查找解决方法。
-
@TomAnderson 查看我帖子的更新以及我对您的回答的评论。