Контекст сеанса нулевой JBOSS 7.1
ОБНОВЛЕНИЕ ВОПРОСА:
Я использовал JBOSS Develper Studio 8, JBOS сервер 7.1 на основе jre 1.7 У меня есть один проект J2EE с ejb и веб-проектами. В проекте ejb у меня есть два идентичных ejb 3.1. В веб-проекте у меня есть только один сервлет. Этот сервлет вызывает простой тестовый метод в первом ejb, а затем во втором ejb. Первым делом в методе тестирования является внедрение зависимостей для контекста сеанса ресурса через этот код
@Resource
private SessionContext context;
Первый ejb работает нормально, но второй (и любой следующий) возвращает нуль для контекста сеанса. Это код comlete:
FirstServlet.java
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
FirstEJB firstEJB = new FirstEJB();
SecondEJB secondEJB = new SecondEJB();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(firstEJB.helloFirst());
out.println(secondEJB.helloSecond());
}
}
FirstEJB.java
@Stateless
public class FirstEJB {
@Resource
private SessionContext contextFirst;
public String helloFirst(){
System.err.println(contextFirst.toString());
return "Hello from FirstEJB";
}
}
SecondEJB.java
@Stateless
public class SecondEJB {
@Resource
private SessionContext contextSecond;
public String helloSecond(){
System.err.println(contextSecond.toString());
return "Hello from SecondEJB";
}
}
Может кто-нибудь знает, в чем проблема.
1 ответ
Первое правило для использования инъекций состоит в том, что ваш сервер (иначе известный как "контейнер") создает объекты, которые вы вводите.
В вашем случае жизненный цикл каждого экземпляра EJB находится под полным контролем контейнера.
В вашем коде firstEJB
созданный вами экземпляр заменяется другим экземпляром, созданным контейнером. secondEJB
экземпляр остается тот, который вы создали (он пропускает @EJB
аннотации), поэтому он не был подвергнут надлежащему управлению жизненным циклом и не был полностью построен с его @Resource
впрыск обработан.
Поэтому, простое изменение вашего кода сервлета:
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
private FirstEJB firstEJB;
@EJB
private SecondEJB secondEJB;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(firstEJB.helloFirst());
out.println(secondEJB.helloSecond());
}
}
должен дать вам желаемый результат.