Контекст сеанса нулевой 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());   
    }
}

должен дать вам желаемый результат.

Другие вопросы по тегам