2013-11-14 4 views
0

Я новичок в EJB, и я пытаюсь получить простой сеансовый компонент без состояния.EJB 3.1 ClassCastException Безстоящий сеанс Bean на сервере glassfish

Я использую для этого стеклянную рыбку.

Что я сделал:

Я создал файл фляги, содержащий интерфейс:

@Local 
public interface SimpleStatelessBeanLocal { 
    public String getHello(); 
} 

Я тогда создал военный файл для моего EJB, содержащий следующий класс (с зависимость в банку с интерфейсом):

@Stateless 
public class SimpleStatelessSessionBean implements SimpleStatelessBeanLocal { 
    public String getHello() { 
     return "Hello from stateless session bean"; 
    } 
} 

затем я создал веб-приложение, с помощью одного сервлета и зависимости к банке с интерфейсом.

@WebServlet("/SimpleServlet") 
public class SimpleServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     InitialContext ctx; 
     try { 
      ctx = new InitialContext(); 
      Object object = ctx.lookup("java:global/simple-stateless-session-bean/SimpleStatelessSessionBean"); 
      response.getWriter().println(object); 
      Class c = object.getClass(); 
      for (Class i : c.getInterfaces()) { 
       response.getWriter().println(i.getName()); 
      } 
      response.getWriter().println(object instanceof SimpleStatelessBeanLocal); 
     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
    } 
} 

Это имеет следующий вывод:

be.sdutry.ejb.tests.stateless.simple.SimpleStatelessBeanLocal_253329002 
com.sun.enterprise.container.common.spi.util.IndirectlySerializable 
be.sdutry.ejb.tests.stateless.simple.SimpleStatelessBeanLocal 
false 

так basicaly он находит Bean, он реализует этот интерфейс, но это не является экземпляр этого интерфейса из текущего загрузчика, который означает, что я могу» t бросить его.

Есть ли что-то, что я делаю неправильно здесь? Я уверен, что должен быть путь вокруг этого, кроме отражения?

Что я уже пробовал: Сообщение, которое я нашел, предложил поместить банку с предоставленным интерфейсом, но тогда я получаю исключение ClassNotFoundException.

с помощью:

  • GlassFish4
  • EJB 3,1
+1

Непосредственно, но мне интересно, почему вы используете контекстный поиск, а не @EJB-инъекцию? Кроме того, EJB3.1 должен быть простым (и он до тех пор, пока вы следуете правилу :): то, что вы пытаетесь здесь, должно работать даже без интерфейсов, как EJB 3.1 Lite), могу ли я предложить самый превосходный [учебник Oracle JavaEE] (http://docs.oracle.com/javaee/7/tutorial/doc/javaeetutorial7.pdf), чтобы помочь вам начать работу? И – fvu

+0

@fvu после ссылки на документацию, которую вы опубликовали, я смог сделать успешный рабочий пример SLSB. Недостатком этого примера является то, что SLSB и фактический код находятся в одном и том же военном файле. Я действительно нуждаюсь в ejb, чтобы быть в отдельной войне, так как в конечном итоге у нас будет несколько проектов с использованием тех же EJB. Мой следующий шаг - посмотреть, все ли работает, если я разберу их в 2 разных войнах. –

+0

см. Главу 5.2 учебника по упаковке, для вашего приложения я бы упаковывал и развертывал EJB как EJB-jar, стиль EJB3 - возможно, завернутый вместе с WAR внутри EAR. Теперь v7 учебника, похоже, в значительной степени фокусируется на новой модели без взаимодействия, вы заметите, что [версия 5 этого же учебника] (http://docs.oracle.com/javaee/5/tutorial/doc/) показывает полный пример EJB, который предоставляет явные локальные и удаленные интерфейсы, вероятно, легче начать с этого примера. – fvu

ответ

0

я сумел заставить его работать. Основная проблема заключалась в том, что SLSB должен был быть удаленным, поскольку используемый с ним код не находился в одном и том же EAR-файле.

Путь я это сделал:

Jar, содержащие только интерфейсы:

public interface SimpleStatelessBeanCommon { 
    public String getHello(); 
} 

@Local 
public interface SimpleStatelessBeanLocal extends SimpleStatelessBeanCommon{ 
} 

@Remote 
public interface SimpleStatelessBeanRemote extends SimpleStatelessBeanCommon{ 
} 

войны, содержащий реализацию Bean (с зависимостью к банку с интерфейсами)

@Stateless 
public class SimpleStatelessSessionBean implements SimpleStatelessBeanLocal, SimpleStatelessBeanRemote { 
    public String getHello() { 
     return "Hello from stateless session bean"; 
    } 
} 

войны с использованием Bean (с зависимостью от банок с интерфейсами)

@WebServlet("/SimpleServlet") 
public class SimpleServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @EJB 
    SimpleStatelessBeanRemote simpleStatelessSessionBean; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.getWriter().println(simpleStatelessSessionBean.getHello()); 
    } 
} 

Я по-прежнему посмотрю, что отправил fvu.

Любые предложения по оптимизации или замечания по-прежнему оцениваются.

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