【问题标题】:EJB cannot be found找不到 EJB
【发布时间】:2015-10-05 22:03:42
【问题描述】:

我正在尝试使用 JavaBeans 或第一次,我得到以下 错误:

javax.naming.NameNotFoundException: DemoEJB

javax.naming.NamingException:查找失败 'java:global/DemoEJB/ContenedorEJB/BeanStateful!beanssesion.BeanStatefulLocal' 在 SerialContext[myEnv={java.naming.factory

我正在使用带有 glassfish 4.1 服务器的 NetBeans。 该应用程序非常简单,我有一个企业应用程序项目,我在其中链接了一个 EJB 模块(称为 ContenedorEJB)和一个客户端(它是一个 Servlet)。

这是项目结构:

  • 客户网站

    • 源码包

      -servlet

      -ServletEJB.java

  • 竞争者EJB

    -源码包

    • 豆瓣

      • BeanStateful.java

      • BeanStatefulLocal.java

  • 演示EJB

    -Java EE 模块

    • ContenedorEJB.jar

    • ClienteEJB.war

servlet 代码如下。我唯一要做的就是查找 sessionBean,

c.lookup("java:global/DemoEJB/ContenedorEJB/BeanStateful!beanssesion.BeanStatefulLocal");

保存它,然后使用实现的方法 getValor 和 setValor 来查看我发送到 EJB 模块的值是否被保存。但是它迷路了,因为它找不到 BeanStateful,即使它在那里。

package servlets;

import beanssesion.BeanStatefulLocal;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletEJB extends HttpServlet {

    BeanStatefulLocal beanStateful = lookupBeanStatefulLocal();

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {

            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet ServletEJB</title>");            
            out.println("</head>");
            out.println("<body>");

            out.println("Enviamos un valor al EJB Stateful: ");
            beanStateful.setValor("Valor desde Servlet");
            out.println("Valor devuelto " + beanStateful.getValor());

            out.println("</body>");
            out.println("</html>");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private BeanStatefulLocal lookupBeanStatefulLocal() {
        try {
            Context c = new InitialContext();
            return (BeanStatefulLocal) c.lookup("java:global/DemoEJB/ContenedorEJB/BeanStateful!beanssesion.BeanStatefulLocal");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }   
}

有人可以帮忙吗?

【问题讨论】:

    标签: java jakarta-ee servlets ejb


    【解决方案1】:

    当您使用 GlassFish 4.1 时,如果您暂时将所有类(包括 EJB)放在 Web 模块中,您会发现生活会更简单。

    其次,您很少需要再使用显式 JNDI 查找了;改用注入:

    public class ServletEJB extends HttpServlet {
    
        @javax.ejb.EJB
        BeanStatefulLocal beanStateful;
    
        ...
    }
    

    但是,使用这样的有状态会话 bean 存在一个大问题。此 servlet 实例将与 所有 客户端共享,您正在注入/查找的 EJB 也将共享。这将导致严重的并发问题。

    【讨论】:

    • 是的,我正在遵循一个示例并尝试有状态和无状态会话 bean。我尝试了您的建议,但仍然找不到 ejb bean: StandardWrapperValve[ServletEJB]: Servlet.service() for servlet ServletEJB throw exception java.lang.NoClassDefFoundError: beanssesion/BeanStatefulLocal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多