我的网络服务有点问题。我将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。
答案 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 );
}