2015-10-05 77 views
1

我试图使用JavaBeans或者第一次,我收到以下错误 :EJB无法找到

javax.naming.NameNotFoundException: DemoEJB

javax.naming.NamingException: Lookup failed for 'java:global/DemoEJB/ContenedorEJB/BeanStateful!beanssesion.BeanStatefulLocal' in SerialContext[myEnv={java.naming.factory

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

这是项目结构:

  • ClienteWeb

    • 源包

      -servlets

      -ServletEJB.java

  • ContenedorEJB

    - 源包

    • beanssesion

      • BeanStateful.java

      • BeanStatefulLocal.java

  • DemoEJB

    -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); 
     } 
    } 
} 

任何人都可以帮忙吗?

回答

0

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

其次,您很少再需要使用显式JNDI查找;使用注射代替:

public class ServletEJB extends HttpServlet { 

    @javax.ejb.EJB 
    BeanStatefulLocal beanStateful; 

    ... 
} 

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

+0

是的,我是一个例子,并尝试有状态和无状态会话bean。我尝试了你的建议,但仍无法找到ejb bean:StandardWrapperValve [ServletEJB]:Servlet.service()for servlet ServletEJB抛出异常 java.lang.NoClassDefFoundError:beanssesion/BeanStatefulLocal – nanonymous