首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SessionContext getBusinessObject创建新bean

SessionContext getBusinessObject创建新bean
EN

Stack Overflow用户
提问于 2013-01-28 05:50:24
回答 2查看 1.6K关注 0票数 0

我正在使用jboss 5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA date=200905221634)。并需要获取bean的业务接口。这对于事务管理是必要的。所以我有:

代码语言:javascript
复制
@Local
public interface MyBeanInterface {
    void transactionalMethod();
}

@Stateless
public class MyBean implements MyBeanInterface {
    @Resource
    private SessionContext context;

    private int aState;

    public void someMethod() {
        aState = 42;
        context.getBusinessObject(MyBeanInterface.class).transactionalMethod();
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void transactionalMethod() {
        System.out.println(aState); // 0!!!!!
    }
}

由于某种原因,我没有得到相同的bean,但创建了新的bean。这是灾难性的,因为transactionalMethod需要状态变量值才能正确执行。

我做错了什么,或者这是jboss的一个bug?顺便说一句,有一个bug会影响通过bean的类获取业务对象的能力:https://issues.jboss.org/browse/EJBTHREE-2126。然而,我不确定这是否与我的问题有关。

EN

回答 2

Stack Overflow用户

发布于 2020-11-11 00:06:49

最好的解决方案是:

代码语言:javascript
复制
@Stateless
public class MyBean implements MyBeanInterface {

    @Resource private TransactionManager tm;

    private int aState;

    public void someMethod() {
        aState = 42;

        Transaction transaction = tm.suspend();

        transactionalMethod();

        tm.resume(transaction);
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void transactionalMethod() {
        System.out.println(aState); // 0!!!!!
    }
}

当您从同一实例调用已发布的接口方法时,通过ejb上下文传递,资源为:

  • 如果为@Stateful,则创建一个新实例。
  • 如果为@Stateful,则为第一次调用创建一个新会话,然后其他调用与@Singleton相同。
  • 如果为@Singleton,则调用方等待资源被释放,以防其调用自身时产生死锁。如果该方法使用@Read进行注释,则调用自己不会创建任何死锁。
票数 1
EN

Stack Overflow用户

发布于 2013-01-28 09:13:27

我没有时间去看语法是否完美,但你可以试试:

代码语言:javascript
复制
InitialContext jndiContext = new InitialContext();
Object ref = jndiContext.lookup("projname/MyBeanInterface/local");
MyBeanInterfaceLocal m = (MyBeanInterfaceLocal) ref;

但是,我看到您有一个SessionContext字段,所以可能对您来说代码应该有一点不同。也许它会是:

代码语言:javascript
复制
Object ref = SessionContext.lookup("projname/MyBeanInterface/local");
MyBeanInterfaceLocal m = (MyBeanInterfaceLocal) ref;

如果这有帮助,请告诉我!

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

https://stackoverflow.com/questions/14552718

复制
相关文章

相似问题

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