根据Java EJB 的规范(这是针对EJB 3.2 的。但与之前的EJB 3.x 相比,EJBContext 没有任何变化),您可以使用注释@Resource 将EJBContext 注入到您的组件中或手动通过查找(第 11.15 节):
容器必须通过注入使组件的 EJBContext 接口可用
使用资源注释或在名称 java:comp/EJBContext 下的 JNDI
查找 EJB 资源的标准方法是通过 EJBContext.lookup 方法,但也有 JNDI 方法,如果您还没有 EJBContext,这是唯一的可能性:
Context initCtx = new InitialContext();
EJBContext ejbCtx = (EJBContext) initCtx.lookup("java:comp/EJBContext");
这正是你所做的,那么有什么问题吗?有两件事,我不确定哪一件。首先,通过手动查找,有时需要在类级别使用注释将资源分配给组件:
@Resource(name = "EJBContext", type = javax.ejb.EJBContext)
public class MyComponent {
...
}
但我不确定EJBContext 是否也需要它,我想不需要。第二件事,更重要和关键 - 再次根据规范:
通过命名环境访问的 EJBContext 对象仅在 bean 内有效
执行查找的实例。
这是第 11.15.1 节,下一个是第 11.15.2 节:
Container Provider 负责为引用提供适当的 EJBContext 对象
隔离组件。返回的对象必须是请求的 bean 的适当特定类型
注入或执行查找——也就是说,容器提供者必须返回一个 SessionContext 接口的实例来引用会话 bean 和一个 MessageDrivenCon-
消息驱动 bean 的文本接口。
这两者都意味着EJBContext 的注入和查找仅在 Enterprise Java Beans 中有效,因此那些带有 @MessageDriven、@Stateful、@Singleton 或 @Stateless 注释的那些(或描述为部署中的 EJB描述符文件,也作为 EJB 2.x 规范)。也许您的组件不是有效的 EJB,这就是查找不起作用的原因?这当然只是建议。
还有一种可能获得EJBContext(更准确地说是SessionContext)。您的组件应该实现具有setSessionContext(SessionContext sessionContext) 方法的SessionBean 接口。每次使用组件时(在某处注入,由客户端或超时调用,尤其是在创建时),EJB 容器都应调用此方法,并且在此方法中您应该将 sessionContext 参数分配给 bean 的字段。