如何将EJB公开为非事务性的Web服务?

时间:2010-12-03 01:51:55

标签: ejb jax-ws java-ee-6

我有一个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) {
        ...
    }
}

有更好的方法吗?

感谢。

纳雷什

1 个答案:

答案 0 :(得分:0)

您可以尝试为方法添加注释:

@TransactionAttribute(TransactionAttributeType.NEVER)

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

Dunno如果网络服务会选择或不接受,但值得一试。

编辑评论:

您尝试过REQUIRES_NEW吗?它们很可能不会传播回Web服务。

否则,是的,你将被困在非交易网络服务的交易部分。

相关问题