いくつかの理由で、アプリケーションを 2 つの別個のアーティファクト ( Users-ejb.jarおよびUsers-war.war )としてデプロイしたいと考えています。これらは同じearにパッケージ化されていません(ただし、同じJBoss AS 7.1 インスタンスにデプロイされています)。Users-war.warには、Users-ejb.jarにパッケージ化された EJB3 を注入したいバッキング Bean (JSF マネージド Bean として注釈が付けられています) があります。すべてが 1 つのearにパッケージ化されていたときに機能していた単純な@EJBインジェクションは、 Users-ejb.jarとUsers-war.warが別々にデプロイされると機能しなくなります。
私のセットアップの絞り込まれた単純化された例は次のとおりです。
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 インジェクションは機能していないようです。
更新: Tom Andersonに よる以下の提案に従いましたが、機能するインジェクションは次のとおりです。
@EJB(mappedName = "java:global/Users-ejb/userFacade!facades.IUserFacadeRemote")
私が理解していれば、ベンダー固有のmappedName属性を正しく使用しています。ベンダーに依存しない方法でインジェクションを機能させることができませんでした。