EJB as Web service with transaction inside
我的网络服务有点问题。我将我的 EJB 公开为带有注释的 Web 服务。
我的其他 Web 服务正在运行,但此 Web 服务无法运行。
在方法中我需要做一些交易。
这是我作为 Web 服务公开的 EJB:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | @Stateless @WebService( endpointInterface="blabla.PfmOverview",serviceName="PfmOverviewWS",name="PfmOverviewWS" ) @XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class) public class PfmOverviewBean implements PfmOverview { SessionContext sessionContext; public void setSessionContext(SessionContext sessionContext) { this.sessionContext = sessionContext; } public PfmOverviewDto getPfmOverview( YUserProfile userProfile, BigDecimal portfolioId,@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class) Date computeDate ) throws Exception { YServerCtx serverCtx = new YServerCtx( userProfile ); UserTransaction ut = null; try { ut = sessionContext.getUserTransaction( ); ut.begin( ); PfmOverviewDto dto = new PfmOverviewBL( serverCtx ).getPfmOverviewDataPf( portfolioId, computeDate ); ut.rollback( ); return dto; } catch( Throwable t ) { if( ut != null ) ut.rollback( ); SLog.error( t ); throw ( t instanceof Exception ) ? (Exception) t : new Exception( t ); } finally { serverCtx.disconnect( ); } } |
当我在客户端调用我的 Web 服务(使用 ws import 自动生成)时,我在这一行得到一个
1 | ut = sessionContext.getUserTransaction( ); |
我是否为
我正在开发 Eclipse 和 Jboss 6.2 as 7.
默认情况下,会话bean 的事务类型是CMT,这意味着容器是唯一可以管理事务的容器。
请记住,
如果您确实需要以编程方式管理事务,可以使用
我解决了这个问题。
事实上,我保留了
我将我的
1 2 3 4 5 6 7 8 | EJBContext sessionContext; ... @Resource private void setSessionContext( EJBContext sctx ) { this.sessionContext = sctx; } |
在我的方法中,为了得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | UserTransaction ut = null; try { ut = sessionContext.getUserTransaction( ); ut.begin( ); //here I'm calling DB access etc: result = blabla.... ut.rollback( ); return result; } catch( Throwable t ) { if( ut != null ) ut.rollback( ); SLog.error( t ); throw ( t instanceof Exception ) ? (Exception) t : new Exception( t ); } |