まず、Java SEをしばらく使用している間、これがJavaEE領域への最初の進出であることを指摘しておきます。私はNetbeans6.9とNetbeansコードジェネレーターを使用して、大部分の手間のかかる作業を行っています(これについてはさらに詳しく説明します)。GlassFishのバージョンは3です。これは、Netbeansをダウンロードしたときに出荷される標準的なものです。
次のように単純な文字列を返すステートレスセッションBeanを作成しました。
@Stateless
public class SDBSStatelessSessionBean implements SDBSStatelessSessionBeanRemote {
@Override
public String sayHello() {
return "This seems to be working just fine.";
}
}
インターフェイス定義は次のとおりです。
@Remote
public interface SDBSStatelessSessionBeanRemote {
String sayHello();
}
クラスとインターフェースはどちらも、Netbeansが提供する「コードの挿入」機能を使用して作成されました。私はこのように私が愚かな初心者のエラーをしないように考えています(皮肉なことに)。
私の問題は、サーブレットからEnterprise Beanを呼び出そうとすると(Netbeansコードジェネレータの「CallEnterprise Bean」オプションを使用して呼び出しが追加された)、次のエラーが発生することです。
javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
例外の原因は次のとおりです: NoClassDefFoundError
これは、サーブレットが呼び出しを行う方法です。
@EJB
private SDBSStatelessSessionBeanRemote sDBSStatelessSessionBean;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Test Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>" + sDBSStatelessSessionBean.sayHello() +"</p>");
out.println("</body>");
out.println("</html>");
} catch (Exception e) {
out.println("<p>" + e.getMessage() + "</p>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
広範囲にわたるグーグルの後で、この問題の解決策を見つけることができなかったのではないかと思います(主に、この問題に近づいているように見えるいくつかのフォーラム投稿には、解決策をたどるには専門用語が多すぎるためです)。
私を正しい方向に向けるアドバイス/助けをいただければ幸いです。