2010-12-03 101 views
1

我有一个如下定义的EJB(使用Java EE 6注释编码):如何将EJB公开为非事务性的Web服务?

@Stateless 
@WebService 
public class SecurityWebService { 

    public void registerUser(RegistrationRequest request) { 
     ... 
    } 
} 

注意,此EJB也被暴露为web服务。但是,我遇到了生成的Web服务的问题。由我的容器(GlassFish)生成的WSDL包含WS-Atomic事务策略,因为默认情况下无状态会话Bean是事务性的(请参阅详细信息here)。不幸的是,我的.NET客户端在WSDL上窒息,因为它不理解WS-AT策略。

所以我真正想要的是一个非干净的Web服务,它不是事务性的,但关联的EJB应该是事务性的(它必须在数据库中插入记录)。我该怎么做呢?我能想到的唯一的方法是创建一个传递到像这样的EJB所有的所谓的“正常”的Web服务 - 不优雅可言:

@WebService 
public class SecurityWebService { 

    @Inject 
    private SecurityService securityService; 

    public void registerUser(RegistrationRequest request) { 
     securityService.registerUser(request); 
    } 
} 

@Stateless 
public class SecurityService { 

    public void registerUser(RegistrationRequest request) { 
     ... 
    } 
} 

有没有更好的办法?

谢谢。

纳雷什

+0

为什么你的解决方案不够优雅?这是责任的完全分离。非事务性Web服务具有与事务性EJB不同的责任。它也可以让你稍后改变事情。 – jhyot 2015-10-23 07:46:54

回答

0

你可以试试注释的方法:

@TransactionAttribute(TransactionAttributeType.NEVER) 

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 

说不上如果Web服务将挑选涨不跌,但它是值得一试。

编辑点评:

你试过REQUIRES_NEW吗?他们可能不会传播回Web服务。

否则,是的,你会被卡在事务部分与非事务性的Web服务。

+0

那么,这确实会从WSDL中删除WS-AT策略,但副作用是我的EJB现在变成了非事务性的。如上所述,这个bean需要执行数据库事务,所以它必须是事务性的。 – Naresh 2010-12-03 04:12:11