Не удается получить SessionContext на EJB

Я не могу получить объект SessionContext на EJB. Я перепробовал все варианты, предложенные в 4 путях получения EJBContext в EJB 3, и ни один из них не сработал. Например, следующий код в моем проекте...

@Stateful
public class SecurityService {
    @Resource
    private SessionContext context;

    @PostConstruct
    public void init() {
    }
}

... генерирует следующее исключение при развертывании:

[#|2012-02-28T14:35:02.805-0300|SEVERE|glassfish3.1.1|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=18;_ThreadName=admin-thread-pool-4848(5);|The log message is null.
java.lang.NullPointerException
    at com.sun.appserv.connectors.internal.api.AppSpecificConnectorClassLoaderUtil.detectResourceInRA(AppSpecificConnectorClassLoaderUtil.java:266)
    at com.sun.appserv.connectors.internal.api.AppSpecificConnectorClassLoaderUtil.processDescriptorForRAReferences(AppSpecificConnectorClassLoaderUtil.java:211)
    at com.sun.appserv.connectors.internal.api.AppSpecificConnectorClassLoaderUtil.processDescriptorForRAReferences(AppSpecificConnectorClassLoaderUtil.java:130)
    at com.sun.appserv.connectors.internal.api.AppSpecificConnectorClassLoaderUtil.detectReferredRARs(AppSpecificConnectorClassLoaderUtil.java:118)
    at com.sun.appserv.connectors.internal.api.ConnectorClassLoaderServiceImpl.getConnectorClassLoader(ConnectorClassLoaderServiceImpl.java:111)
    at com.sun.enterprise.v3.server.ClassLoaderHierarchyImpl.getConnectorClassLoader(ClassLoaderHierarchyImpl.java:117)

Если я удаляю аннотацию @Resource, она развертывается, но не работает (я пробовал использовать JNDI и другие методы, упомянутые ранее).

Я использую Glassfish 3.1.1, и мой проект - JSF с CDI и EJB локально для сервисов с JPA. Я пытался внедрить SessionContext на бобах CDI, но получил те же ошибки. Мой EJB настроен с аннотациями, а мой beans.xml не имеет конфигураций (но существует).

Одна странная вещь заключается в том, что с помощью поиска JNDI мне удалось получить объект типа SessionContextImpl по пути java:/comp/EJBContext в методе @PostConstruct init(). НО, он обнуляется, как только вызывается другой метод EJB (?), И он не содержит данных о ролях пользователя (вызов isCallerInRole() вызывает исключение). Кроме того, это не объект EJBContext.

Я упаковываю все в WAR, используя Maven, и зависимость Java EE помечена как предоставленная, как показано ниже:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>

Мне кажется, что контейнер не предоставляет SessionContext (EJBCOntext) вообще. Я даже не знаю, возможно ли это, и понятия не имею, как это решить.

Пожалуйста, если у вас есть ЛЮБОЕ представление об этом, я буду рад это услышать. Спасибо.

2 ответа

Решение

Ну, я обновился до Glassfish 3.1.2, и проблема была решена. Теперь я могу вводить javax.ejb.SessionContext как и ожидалось.

Отдельное спасибо @perissf за помощь.

Если ваш Принципал вошел в систему с помощью j_security_check, вы можете ввести SecurityContext в EJBили в ManagedBeanи получить информацию о Принципале и роли следующим образом:

@Context private SecurityContext context;
....
boolean isInRole = context.isUserInRole("A role");
Principal p = context.getUserPrincipal();
Другие вопросы по тегам