2015-10-05 4 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 сервера. Приложение действительно просто, у меня есть проект приложения Enterprise, где я связываю модуль EJB (называемый ContenedorEJB) и клиент (который является сервлетом).

Это структура проектов:

  • ClienteWeb

    • Источник Пакеты

      -servlets

      -ServletEJB.java

  • ContenedorEJB

    -source Пакеты

    • beanssesion

      • BeanStateful.java

      • BeanStatefulLocal.java

  • DemoEJB модули

    -java EE

    • ContenedorEJB.jar

    • ClienteEJB.war

Код сервлета приведен ниже. Единственное, что я могу сделать, это посмотреть на 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) в свой веб-модуль.

Во-вторых, вам редко приходится использовать явные запросы JNDI; Вместо этого используйте инъекционную инъекцию:

public class ServletEJB extends HttpServlet { 

    @javax.ejb.EJB 
    BeanStatefulLocal beanStateful; 

    ... 
} 

НО, существует большая проблема с использованием сессионных бобах, подобных состоянию. Этот экземпляр сервлета будет использоваться совместно с всеми клиентами, и так будет EJB, который вы вводите/смотрите вверх. Это приведет к серьезным проблемам параллелизма.

+0

Да, я следовал примеру и пытался использовать как сессионные компоненты Stateful, так и Stateless. Я попробовал то, что вы предложили, но он все еще не может найти компонент ejb: StandardWrapperValve [ServletEJB]: Servlet.service() для сервлета ServletEJB выбрал исключение java.lang.NoClassDefFoundError: beanssesion/BeanStatefulLocal – nanonymous

Смежные вопросы