【问题标题】:Can't get SessionContext on EJB无法在 EJB 上获取 SessionContext
【发布时间】:2012-02-28 17:55:57
【问题描述】:

我无法在 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,我的项目是 JSF,在本地使用 CDI 和 EJB 到使用 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)。我不知道这是否可能,我也不知道如何解决这个问题。

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

【问题讨论】:

  • 该博客指的是 Java EE 5。如果您使用 Java EE 6,并且查看您的帖子似乎确实如此,这要简单得多:从本教程开始 docs.oracle.com/javaee/6/tutorial/doc 和其他使用 EJB 3.1
  • perissf,我需要 SessionContext 以编程方式保护我的应用程序的某些部分(使用基于方法的安全性太复杂了)。 Java EE 6 教程(您发布的链接)显示了与引用 Java EE 5 的博客相同的方法(参考:docs.oracle.com/javaee/6/tutorial/doc/bnbyl.html#gjgcs)。另外,我查看了 O'Reilly 的书“Enterprise JavaBeans 3.1”,它说只是使用 @Resource 注释来获取 EJBContext 或 SessionContext 对象。我认为是配置或环境相关的问题,但不知道要查找什么。

标签: ejb glassfish-3 cdi


【解决方案1】:

如果您的委托人已使用j_security_check 登录,您可以将SecurityContext 注入EJBManagedBean,并检索委托人和角色的信息,如下所示:

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

【讨论】:

  • perissf,使用 @Context 在部署时也会出现异常。而且我不明白:您传递的 j_security_check (我正在使用)的链接有一个使用@Resource 的示例。无论如何,两者都不起作用。 :(
  • 部署时遇到什么异常?
  • 加载应用程序时出现异常:WELD-001413 bean Session bean [class SecurityService with qualifiers [@Any @Default @Named ];本地接口是 [SecurityService] 声明钝化范围但具有不可序列化的依赖关系 com.sun.jersey.server.impl.cdi.CDIExtension$ParameterBean@4ebf837a org.jboss.weld.exceptions.UnserializableDependencyException: WELD-001413 bean 会话 bean [具有限定符的类 SecurityService [@Any @Default @Named];本地接口是 [SecurityService] 声明的 ....................
  • 请更新您的问题,或创建一个新问题,其中包含所有相关代码,包括导入以及异常。
  • 我找到了解决方案:升级到 Glassfish 3.1.2 解决了这个问题。谢谢@perissf。
【解决方案2】:

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

特别感谢 @perissf 的帮助。

【讨论】:

  • 欢迎。如果我的回答有用,你可以点赞。如果升级解决了您的问题,那么您的域配置可能有问题,创建一个全新的域有望解决您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多