我有一个EJB(使用Java EE 6注释编码),其定义如下:
@Stateless
@WebService
public class SecurityWebService {
public void registerUser(RegistrationRequest request) {
...
}
}
请注意,此EJB也作为Web服务公开。但是,我遇到了生成的Web服务的问题。我的容器(GlassFish)生成的WSDL包含WS-Atomic Transaction策略,因为默认情况下无状态会话bean是事务性的(请参阅详细信息here)。不幸的是我的.NET客户端因为不了解WS-AT策略而在WSDL上窒息。
所以我真正想要的是一个非常干净的Web服务,它不是事务性的,但关联的EJB应该是事务性的(它必须在数据库中插入记录)。我该怎么做呢?我能想到的唯一方法是创建一个“普通”Web服务,将所有调用传递给这样的EJB - 根本不优雅:
@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 :(得分:0)
您可以尝试为方法添加注释:
@TransactionAttribute(TransactionAttributeType.NEVER)
或
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
Dunno如果网络服务会选择或不接受,但值得一试。
编辑评论:
您尝试过REQUIRES_NEW吗?它们很可能不会传播回Web服务。
否则,是的,你将被困在非交易网络服务的交易部分。