由于某些原因,我想将我的应用程序部署为两个独立的工件:Users-ejb.jar和Users-war.war,它们没有打包在同一个耳朵中(但仍然部署在同一个JBoss AS 7.1 实例中)。在Users-war.war 中,我有一个支持 bean(注释为 JSF 托管 bean),我希望在其中注入一个打包在Users-ejb.jar中的 EJB3 。当单独部署Users-ejb.jar和Users-war.war时,当所有东西都打包在一个耳朵中时,简单的@EJB注入不再起作用。
我的设置的一个缩小的简化示例如下:
EJB3 豆
import javax.ejb.*;
(...)
@Stateless(name="userFacade")
@Local(IUserFacadeLocal.class)
@Remote(IUserFacadeRemote.class)
public class UserFacade extends AbstractFacade<User> implements IUserFacadeLocal, IUserFacadeRemote {
支持豆
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 抱怨它找不到他应该注入的 bean。
但是,我可以使用 JNDI 获取对 EJB3 bean 的引用:
String jndiName = "java:global/Users-ejb/userFacade!facades.IUserFacadeRemote";
this.userFacade = (IUserFacadeRemote) new InitialContext().lookup(jndiName);
尽管如此,@EJB 注入似乎不起作用。
更新: 我遵循了汤姆安德森下面给出的建议,并且有效的注射是:
@EJB(mappedName = "java:global/Users-ejb/userFacade!facades.IUserFacadeRemote")
如果我理解正确,它使用供应商特定的 mappedName 属性。我无法让注入以独立于供应商的方式工作。