EJB作为内部事务的Web服务

时间:2014-04-22 14:15:22

标签: web-services jboss nullpointerexception jaxb transactional

我的网络服务有点问题。我将EJB作为带注释的Web服务公开。

我的其他网络服务正在运行,但此网络服务不起作用。 在方法中,我需要做一些交易。

这是我作为Web服务公开的EJB:

@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自动生成)时,我会在此行获得NullPointerException

ut = sessionContext.getUserTransaction( );

我是否为UserTransaction或其他任何内容添加注释?

我正在使用Eclipse和Jboss 6.2作为7。

2 个答案:

答案 0 :(得分:1)

默认情况下,会话bean的事务类型为CMT,这意味着Container是唯一可以管理事务的容器。 getUserTransaction()方法只能从具有Bean管理事务的bean中调用。

请记住,getPfmOverview()业务方法已在Container创建的事务中执行。

如果您确实需要以编程方式管理事务,则可以使用@TransactionManagement注释更改Bean事务类型。

答案 1 :(得分:0)

我解决了这个问题。 实际上,我保留了@Resource@TransactionManagement注释。 我将SessionContext更改为EJBContext,我也改变了我的setSessionContext

EJBContext sessionContext;
...

@Resource
 private void setSessionContext( EJBContext sctx )
{
    this.sessionContext = sctx;
}

在我的方法中,我要做userTransaction

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 );
    }