我正在使用jboss 5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA date=200905221634)。并需要获取bean的业务接口。这对于事务管理是必要的。所以我有:
@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。然而,我不确定这是否与我的问题有关。
发布于 2020-11-11 00:06:49
最好的解决方案是:
@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上下文传递,资源为:
发布于 2013-01-28 09:13:27
我没有时间去看语法是否完美,但你可以试试:
InitialContext jndiContext = new InitialContext();
Object ref = jndiContext.lookup("projname/MyBeanInterface/local");
MyBeanInterfaceLocal m = (MyBeanInterfaceLocal) ref;但是,我看到您有一个SessionContext字段,所以可能对您来说代码应该有一点不同。也许它会是:
Object ref = SessionContext.lookup("projname/MyBeanInterface/local");
MyBeanInterfaceLocal m = (MyBeanInterfaceLocal) ref;如果这有帮助,请告诉我!
https://stackoverflow.com/questions/14552718
复制相似问题