打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java – 从无状态EJB访问SessionScoped对象

我有一个SessionScoped类.对于每个用户访问,我需要一个自己的这个类的实例.一切都很好,很长一段时间.
但是现在我还需要从后端访问这些对象,而无需任何用户交互.
我确实有一个无状态的企业bean,但每当我想访问会话作用域对象时,我都会得到一个例外.
一个简单的示例代码如下:

@SessionScopedpublic class SessionObj implements Serializable {    public String getValue() {        return "Hello World";    }}@Statelesspublic class StatelessBean {    private static final Logger LOG=Logger.getLogger(StatelessBean.class);    @Inject    private SessionObj sessionObj;    public void test() {        LOG.info("session object: " sessionObj);        LOG.info("Method call: " sessionObj.getValue());    }}

但调用测试方法的结果如下:

12:19:10,484 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (EJB default - 6)    javax.ejb.EJBTransactionRolledbackException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped12:19:10,484 ERROR [org.jboss.ejb3.invocation] (EJB default - 6) JBAS014134: EJB Invocation failed on component StatelessBean for method public void package.StatelessBean.test(): javax.ejb.EJBTransactionRolledbackException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleInCallerTx(CMTTxInterceptor.java:139) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:204) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]    at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:306) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]    ...Caused by: org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active    contexts for scope type javax.enterprise.context.SessionScoped    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:598) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:71) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:79) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]    at package.SessionObj$Proxy$_$$_WeldClientProxy.toString(SessionObj$Proxy$_$$_WeldClientProxy.java) [ws_core_job_manager.jar:]    at java.lang.String.valueOf(String.java:2826) [rt.jar:1.6.0_21]    at java.lang.StringBuilder.append(StringBuilder.java:115) [rt.jar:1.6.0_21]    at package.StatelessBean.test(StatelessBean.java:29) [ws_core_job_manager.jar:]    ...

所以我的问题是:
*是否有任何选项可以访问对象,即使没有任何技巧的会话?
*有没有选择从我的无状态类中生成一个会话?

我理解异常的原因但我希望为现有代码的这种新用法设置一个“全局”会话.当然,实际上并不是那么容易,并且将会话范围代码更改为POJO并且会话范围容器并不那么容易.

环境:

> JDK 1.6
> JBOSS 7.1.1

解:

正如Jan所说:
如下所示扩展StatelessBean:

@Statelesspublic class StatelessBean {    private static final Logger LOG=Logger.getLogger(StatelessBean.class);    @Inject    private BoundSessionContext sessionContext;    @Inject    private SessionObj sessionObj;    public void test() {        Map<String,Object> myMap=new HashMap<String,Object>();        sessionContext.associate(myMap);        sessionContext.activate();        LOG.info("session object: " sessionObj);        LOG.info("Method call: " sessionObj.getValue());        sessionContext.invalidate();        sessionContext.deactivate();    }}

这个例子正在发挥作用!
现在我只需了解细节;-)

解决方法:

问题不是访问会话范围的bean本身,问题是会话不活动,可能是因为它从未启动过(例如EJB远程处理).

你可以做的是手动启动一个BoundSessionContext,看看here.我做了那个对话,它工作正常.

来源:https://www.icode9.com/content-1-297301.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
整合 jboss-4.0.x 和hibernate-4.x
学习jbpm开始一章中剩余部分
jboss相关的ejb配置引用完全说明.包括jboss-web.xml,ejb-jar.xml等.
在JBoss下开发、部署EJB
jboss4.0安装及duke‘s bank部署心得
将JBoss EJB应用程序迁移到WebLogic上
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服