无法在EJB上获取SessionContext

时间:2012-02-28 17:55:57

标签: ejb glassfish-3 cdi

我无法在EJB上获得SessionContext对象。我已经尝试了4 Ways to Get EJBContext in 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,我的项目是带有CDI和EJB的JSF本地服务与JPA。我尝试在CDI bean上注入SessionContext但收到了同样的错误。我的EJB配置了注释,我的beans.xml没有配置(但存在)。

奇怪的是,通过JNDI查找,我设法在@PostConstruct init()方法的路径java:/ comp / EJBContext上获得了SessionContextImpl类型的对象。但是,一旦调用另一个EJB方法(?)它就会变为null,并且它不包含用户的角色数据(对isCallerInRole()的调用会引发异常)。此外,它不是EJBContext对象。

我使用Maven将所有内容打包在WAR中,Java EE的依赖关系标记为提供,如下所示:

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

在我看来,容器根本没有提供SessionContext(EJBCOntext)。我不知道即使这是可能的,我也不知道如何解决这个问题。

拜托,如果你有任何想法,我会很高兴听到。谢谢。

2 个答案:

答案 0 :(得分:4)

如果您的校长已使用j_security_check登录,则可以在SecurityContextEJB中注入ManagedBean,并检索此类校长和角色的信息:

@Context private SecurityContext context;
....
boolean isInRole = context.isUserInRole("A role");
Principal p = context.getUserPrincipal();

答案 1 :(得分:1)

好吧,我已升级到Glassfish 3.1.2,问题解决了。现在我可以按预期注入javax.ejb.SessionContext

特别感谢@perissf的帮助。