Я новичок в 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
Непосредственно, но мне интересно, почему вы используете контекстный поиск, а не @EJB-инъекцию? Кроме того, EJB3.1 должен быть простым (и он до тех пор, пока вы следуете правилу :): то, что вы пытаетесь здесь, должно работать даже без интерфейсов, как EJB 3.1 Lite), могу ли я предложить самый превосходный [учебник Oracle JavaEE] (http://docs.oracle.com/javaee/7/tutorial/doc/javaeetutorial7.pdf), чтобы помочь вам начать работу? И – fvu
@fvu после ссылки на документацию, которую вы опубликовали, я смог сделать успешный рабочий пример SLSB. Недостатком этого примера является то, что SLSB и фактический код находятся в одном и том же военном файле. Я действительно нуждаюсь в ejb, чтобы быть в отдельной войне, так как в конечном итоге у нас будет несколько проектов с использованием тех же EJB. Мой следующий шаг - посмотреть, все ли работает, если я разберу их в 2 разных войнах. –
см. Главу 5.2 учебника по упаковке, для вашего приложения я бы упаковывал и развертывал EJB как EJB-jar, стиль EJB3 - возможно, завернутый вместе с WAR внутри EAR. Теперь v7 учебника, похоже, в значительной степени фокусируется на новой модели без взаимодействия, вы заметите, что [версия 5 этого же учебника] (http://docs.oracle.com/javaee/5/tutorial/doc/) показывает полный пример EJB, который предоставляет явные локальные и удаленные интерфейсы, вероятно, легче начать с этого примера. – fvu