Как получить SessionContext в JBOSS

Я пробовал несколько способов в сеансе bean, например:

@Resource
private SessionContext ctx;

ИЛИ

private SessionContext ctx;

@Resource
private void setSessionContext(SessionContext ctx) {
  this.sctx = ctx;
}

ИЛИ

InitialContext ic = new InitialContext();
SessionContext ctx = (SessionContext) ic.lookup("java:comp/env/sessionContext");

Ни один из них не работал, в JBOSS произошли исключения differnet.

Я действительно злюсь об этом. Кто-нибудь может сказать мне, что случилось. Большое спасибо!

Ответ 1

Два первых решения (инъекция впрыска и инжекции впрыска) выглядят отлично, а должны работать.

У меня есть сомнения относительно третьего (подход поиска), поскольку вы не указали соответствующую аннотацию @Resource(name="sessionContext"), но она должна работать, если она правильно используется.

Четвертым вариантом будет поиск стандартного имени java:comp/EJBContext

@Stateless
public class HelloBean implements com.foo.ejb.HelloRemote {
  public void hello() {
    try {
      InitialContext ic = new InitialContext();
      SessionContext sctxLookup = 
          (SessionContext) ic.lookup("java:comp/EJBContext");
      System.out.println("look up EJBContext by standard name: " + sctxLookup);
    } catch (NamingException ex) {
      throw new IllegalStateException(ex);
    }
  }
}

Эти четыре подхода совместимы с EJB 3 и должны определенно работать с любым сервером приложений Java EE 5, как напомнили в 4 способа получить EJBContext в EJB 3. Просьба предоставить полную статистику стека исключения, которое вы получаете, если они этого не делают.

Ответ 2

Вы можете перечислить эти привязки с помощью следующего кода, он покажет вам, что доступно в контексте. (Это использует groovy код для выполнения итерации (каждый) по перечислению)

Context initCtx = new InitialContext();
Context context = initCtx.lookup("java:comp") as Context
context.listBindings("").each {
   println it
}

Зависимая, если этот код запущен в контексте ejb или в веб-контексте, вы увидите другой вывод.