私は、netbeans、glassfish3.1、EJB3、および JSF2 を使用して Maven エンタープライズ アプリケーションを開発しています。JSFマネージドBeanにDAOFacade EJBを注入したいのですが、うまくいきません。エラーメッセージは次のとおりです。
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=com.procc.beans.AlertController/ejbFacade,Remote 3.x interface =com.procc.dao.AlertFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.procc.dao.AlertFacade,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'com.procc.dao.AlertFacade#com.procc.dao.AlertFacade' [Root exception is javax.naming.NamingException: Lookup failed for 'com.procc.dao.AlertFacade#com.procc.dao.AlertFacade' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: com.procc.dao.AlertFacade#com.procc.dao.AlertFacade not found]]
DAOFAcade は EJB モジュールに配置され、JSF マネージド Bean は war モジュールに配置されます。
+EARプロジェクト
--+EJB モジュール
------AlertFacade.java
--+WARモジュール
------AlertController.java
同じ EJB をサーブレットに注入しようとしたところ、次のようにうまくいきました。
@WebServlet(name = "DAOServlet", urlPatterns = {"/DAOServlet"})
public class DAOServlet extends HttpServlet {
@EJB
private AlertFacadeLocal alertFacade;
@EJB
private AnomalyFacadeLocal anomalyFacade;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List alertList = alertFacade.findAll();
out.println("found "+alertList.size()+" alerts");
}
}
これがJSFマネージドBeanです: @ManagedBean @ViewScoped public class AlertController extends AbstractController implements Serializable {
@EJB
private AlertFacade ejbFacade;
public AlertController() {
super(Alert.class);
}
@PostConstruct
public void init() {
super.setFacade(ejbFacade);
}
}
これは DAO ファサード EJB です。
@Stateless
public class AlertFacade extends AbstractFacade<Alert> implements AlertFacadeLocal {
@PersistenceContext(unitName = "flams_pu")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public AlertFacade() {
super(Alert.class);
}
}
インターネットで検索しましたが、問題を解決できませんでした。助けてください。
はい、ライト!コントローラーマネージドBeanを忘れていました。ここにあります:
@ManagedBean
@ViewScoped
public class AlertController extends AbstractController<Alert> implements Serializable {
@EJB
private AlertFacade ejbFacade;
public AlertController() {
super(Alert.class);
}
@PostConstruct
public void init() {
super.setFacade(ejbFacade);
}
}
JSFページで:
<p:dataTable var="item" value="#{alertController.items}" paginator="true">
このエラーは、ejbFacade を AlertController に注入することによってスローされます。