首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SessionContext 7.2中查找JBoss

在SessionContext 7.2中查找JBoss
EN

Stack Overflow用户
提问于 2014-04-03 09:00:28
回答 1查看 1.4K关注 0票数 2

出于各种原因,我需要手动查找SessionContext。在JBoss5中,解决方案

代码语言:javascript
复制
InitialContext initialContext = new InitialContext();
SessionContext sessionContext = (SessionContext) initialContext.lookup("java:comp/EJBContext");

服务很好,但是从JBoss 7我得到了一个

代码语言:javascript
复制
javax.naming.NameNotFoundException: EJBContext -- service jboss.naming.context.java.global.EJBContext

在JBoss 7.2中查找上下文的方式是否发生了变化,还是我的部署缺少任何重要内容?作为参考,标准注入工作正常,这是唯一失败的查找。或者我做了什么可怕的错误(除了执行SessionContext的手动查找)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-15 09:33:24

根据Java规范(这个是EJB3.2)。但是EJBContext与以前的EJB3.x没有任何变化,您可以使用注释@Resource或通过查找手动将EJBContext注入组件(第11.15节):

容器必须通过使用资源注释的注入或在JNDI中使用java:comp/EJBContext使组件的EJBContext接口可用

查找EJB资源的标准方法是通过EJBContext.lookup方法,但也有JNDI方法,如果您没有EJBContext,这是唯一的可能。

代码语言:javascript
复制
Context initCtx = new InitialContext();
EJBContext ejbCtx = (EJBContext) initCtx.lookup("java:comp/EJBContext");

这正是你所做的,所以有什么不对?有两件事我不确定。首先,通过手动查找,有时需要在类级别为带有注释的组件分配资源:

代码语言:javascript
复制
@Resource(name = "EJBContext", type = javax.ejb.EJBContext)
public class MyComponent {
...
}

但我不确定EJBContext是否也需要它,我想也不需要。第二件事,更重要和更关键的是--再一次根据规范:

通过命名环境访问的EJBContext对象仅在执行查找的bean实例中有效。

本款为第11.15.1款,下一款为第11.15.2款:

容器提供程序负责向引用组件提供适当的EJBContext对象。返回的对象必须为请求注入或执行查找的bean具有适当的特定类型--也就是说,容器提供程序必须将SessionContext接口的实例返回给引用会话bean,并将MessageDrivenCon文本接口的实例返回到消息驱动的bean。

这都意味着EJBContext的注入和查找仅在Enterprise中有效,因此那些被@MessageDriven@Stateful@Singleton@Stateless注释的mean (或者在部署描述符文件中被描述为EJB,也称为EJB2.x规范)。也许您的组件不是有效的EJB,这就是为什么查找不能工作?当然,这只是建议而已。

获得EJBContext (更准确地说是SessionContext)还有一种可能性。您的组件应该实现具有SessionBean方法的setSessionContext(SessionContext sessionContext)接口。每次使用组件时,EJB容器都应该调用此方法(注入某个位置、客户端调用或超时,特别是在创建该方法时),在此方法中,您应该将sessionContext参数分配给bean的字段。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22832640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档