关于 jboss:EJB as Web service with transaction inside

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 自动生成)时,我在这一行得到一个 NullPointerException

1
ut = sessionContext.getUserTransaction( );

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

我正在开发 Eclipse 和 Jboss 6.2 as 7.


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

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

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


我解决了这个问题。
事实上,我保留了 @Resource@TransactionManagement 注释。
我将我的 SessionContext 更改为 EJBContext 并且我也更改了我的 setSessionContext ,如下所示:

1
2
3
4
5
6
7
8
EJBContext sessionContext;
...

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

在我的方法中,为了得到 userTransaction 我这样做:

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